我一直用C / C ++编写程序,使用Linux API并进行系统调用,如fork(),read(),write()等。现在,我开始怀疑这些库函数是否真的系统调用,或者它们是某种包装函数。
当程序调用write()时会发生什么? 这个函数如何与内核交互? 如果这是一个包装器那么我们为什么需要呢?
答案 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()
系统调用的包装