如何解决为什么我在 C 中调用 fork() 而是使用 sys_clone() 系统调用?为什么不是 sys_fork() 系统调用?
这是我的源代码 测试.c:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
pid_t pid;
pid=fork();
if(pid==0){
printf("new process\n");
}else{
printf("old process\n");
}
return 0;
}
我编译它:
gcc test.c -o fork
我发现它通过 strace 生成 sys_clone() 系统调用而不是 sys_fork()。
$strace -o my ./fork
new process
old process
$cat my | grep clone
clone(child_stack=NULL,flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,child_tidptr=0x7f459f17d810) = 4415
$cat my | grep fork
execve("./fork",["./fork"],0x7ffc76ccbf00 /* 52 vars */) = 0
在脚本中看到 clone() 了吗?为什么不分叉?
解决方法
clone(2)
是 Linux 特定的系统调用,它取代了 fork(2)
系统调用。
因此 clone
用于在 Linux 上创建所有“类进程”实体(用于创建线程、实现 vfork、posix_spawn 等)。
基本上,fork
等价于带有特定标志的 clone
。所以这就是您在 clone
下看到 strace
的原因。
当然,POSIX fork
不会被弃用,也不会消失。所以使用 fork
不是问题。只是 Linux 上的 C 库实现使用 clone
系统调用来实现 fork
。
在 某些 版本的 几个 Linux C 库(例如 GNU libc 或 musl-libc)中,fork
函数实际上是通过调用 clone
由于这些库是开源的,您可以下载它们的源代码并进行研究(甚至改进该源代码)
另见ldd(1)、syscalls(2)、fork(2)、clone(2)、uname(2)、errno(3)、execve(2)、{{3 }}、elf(5)、credentials(7) 等等......并阅读ld.so(8)
也许某些 C 库正在使用 clone
或 fork
,这取决于对 Advanced Linux Programming 的某些初始调用的结果
也读一些uname(2)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。