我知道对 glibc“写入”函数的调用会调用内核函数 sys_call 写入函数。
因为 sys_call 是内核函数,所以 CPU 必须将环更改为零来存储进程寄存器等等。
但是它总是切换到内核模式吗?例如,如果我这样做
write(-1,buffer,LENGTH)
它是否仍然试图在文件描述符数组中找到它?
我在 glibc 源代码中看到它确实检查了 fd>0,但我没有看到任何跳转到那里的 sys_call(似乎 main() 的 baracks 在任何调用 alias_write 之前结束。
< br/>
/* Write NBYTES of BUF to FD. Return the number written, or -1. */
ssize_t
__libc_write (int fd, const void *buf, size_t nbytes)
{
if (nbytes == 0)
return 0;
if (fd < 0)
{
__set_errno (EBADF);
return -1;
}
if (buf == NULL)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
libc_hidden_def (__libc_write)
stub_warning (write)
weak_alias (__libc_write, __write)
libc_hidden_weak (__write)
weak_alias (__libc_write, write)
#include <stub-tag.h>
所以问题是:
- glibc 实际上在哪里调用 sys_write
- 如果 fd<0,glibc 不调用 sys_write 是真的吗?
最佳答案
I see in the glibc source code that it does check for fd>0 but i don't see any jump to the sys_call there
您正在查看错误的代码。
__libc_write
有多种定义,在不同的条件下使用。您查看的那个在 io/write.c
中。
在 Linux 上实际使用的那个是从 sysdeps/unix/syscall-template.S
生成的,它确实实际执行即使在 fd==-1
等情况下也切换到内核模式(并返回用户模式)
关于linux - 是否每次调用 write 都会切换到内核模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48623453/