下面是我的源码test.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我发现它用sys_clone() syscall代替了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()?为什么不使用fork呢?
发布于 2021-03-30 21:07:11
clone(2)是一个特定于Linux系统调用,它取代了fork(2)系统调用。因此,clone用于在Linux上创建所有“类似进程”的实体(用于创建线程、实现vfork、posix_spawn等等)。基本上,fork等同于带有特定标志的clone。这就是为什么你在strace下看到clone的原因。
当然,POSIX fork不会被弃用,也不会消失。所以使用fork不是问题。只有Linux上C库实现使用clone系统调用来实现fork。
https://stackoverflow.com/questions/66871317
复制相似问题