像 read() 、write() 这样的函数调用在 Linux 中是实际的系统调用吗?
Are function calls like read() , write() actual system calls in 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()
包装器
相关文章:
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 如何知道我正在使用的Linux OS是否具有特定的系统调用
- Linux 系统调用 + 交叉编译
- 如何使用C/C 系统调用来获取Linux过程中一个过程的当前大小
- 如何使用Linux GetRandom系统调用来在范围内生成一个随机数
- 将 linux 中的 ftime() 系统调用替换为合适的系统调用
- 像 read() 、write() 这样的函数调用在 Linux 中是实际的系统调用吗?
- Linux 读取系统调用不从文件读取
- 在 C++ 中使用 Linux 系统调用以及文件和文件夹管理
- 如何使用linux系统调用编写一个c++程序,该调用提供有关可用内存、已用内存和内核版本的输出
- poll()系统在Linux中调用带有分段错误的核心转储
- 如何在C/C++中获得Linux系统调用的输出
- 从malloc()进行的Windows和Linux本机OS/系统调用是什么
- Linux C++程序通过系统调用启动bash脚本时总是返回-1
- 在Windows上编写C++,但通过Linux模拟器使用Linux系统调用
- Linux-有没有一种方法可以在不分叉新进程的情况下调用系统调用(bash脚本)
- linux中投票系统调用的错误行为
- 在 Linux 0.01 中添加系统调用以使用 C++ "Semaphore"
- 如何阻止 Linux "read"系统调用阻塞?
- 如何使用编程方法拦截linux上运行进程中调用的系统调用