在linux中函数调用如read(),write()实际系统调用吗?

时间:2016-02-28 07:40:42

标签: c++ c linux

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

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

2 个答案:

答案 0 :(得分:6)

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

请注意,除了调用内核(如fmod(3))之外,纯粹用户空间(如execl(3))或在用户空间中执行某些操作的函数在第3节中有自己的联机帮助,而只调用的函数内核(如read(2))在第2节中有它们。

答案 1 :(得分:1)

使用这个简单的代码:

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()系统调用的包装