我现在试图通过研究实际的代码实现来了解 read(2) 函数的工作原理,首先,我尝试了解它是如何在 #include 头文件中定义的。
在该文件中,我发现了这个:
ssize_t read(int, void *, size_t) __DARWIN_ALIAS_C(read);
Run Code Online (Sandbox Code Playgroud)
然后,我用谷歌搜索找到了实际的 read() 函数声明。
和,
https://github.com/lattera/glibc/blob/master/io/read.c
我找到了这个。在这段代码中,
/* Read NBYTES into BUF from FD. Return the number read or -1. */
ssize_t
__libc_read (int fd, 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;
}
Run Code Online (Sandbox Code Playgroud)
现在这是我的问题。
__libc_之前是什么read?为什么需要它?当用户调用read(2)时,如何调用这个函数?
在我看来,这段代码与从文件描述符读取缓冲区无关,而是只有处理可能的错误的代码: fd < …