像 read() 、write() 这样的函数调用在 Linux 中是实际的系统调用吗?



我一直在用C/C++编写程序,这些程序使用Linux API并进行系统调用,如fork(),read(),write()等。现在,我开始怀疑这些库函数是否实际上是系统调用,或者它们是某种包装函数。

当程序调用 write() 时到底会发生什么?这个函数如何与内核交互?如果这是一个包装器,那么我们为什么需要它?

所有这些函数都是真正的用户空间函数,libc.so您的二进制文件与之链接。但它们中的大多数只是系统调用的微小包装器,它们是用户空间和内核之间的接口(另见syscall(2))。

请注意,纯粹是用户空间(如fmod(3))或在用户空间中除了调用内核之外执行某些操作的函数(如execl(3))在第3节中有其手册页,而仅调用内核的函数(如read(2))在第2节中有它们。

使用以下简单代码

int main()
{
    int f = open("/tmp/test.txt", O_CREAT | O_RDWR, 0666);
    write(f, "hello world", 11);
    close(f);
    return 0;
}

您可以使用strace查找二进制文件中使用的系统调用:

gcc test.c -o test
strace ./test

结果是这样的:

.
.
.
open("/tmp/test.txt", O_RDWR|O_CREAT, 0666) = 3
write(3, "hello world", 11)             = 11
close(3)                                = 0
exit_group(0)                           = ?

至于fork(),它实际上是系统调用clone()包装器

最新更新