繁体   English   中英

为什么我在 C 中调用 fork() 而是使用 sys_clone() 系统调用? 为什么不是 sys_fork() 系统调用?

[英]Why I call fork() in C but make sys_clone() syscall instead? Why not sys_fork() syscall?

这是我的源代码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

我发现它通过 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(2)是一个 Linux 特定的系统调用,它取代了fork(2)系统调用。 因此, clone用于在 Linux 上创建所有“类似进程”的实体(用于创建线程、实现 vfork、posix_spawn 等)。 基本上, fork等同于带有特定标志的clone 这就是为什么您在strace下看到clone的原因。

当然, POSIX fork并没有被弃用,也不会消失。 所以使用fork不是问题。 只是 Linux 上的 C 库实现使用clone系统调用来实现fork

在 Linux 的几个C 库的某些版本中(例如GNU libcmusl-libc ), fork function 实际上是通过调用clone实现的

由于这些库是开源的,您可以下载它们的源代码并进行研究(甚至改进该源代码)

另请参见ldd(1)syscalls(2)fork(2)clone(2)uname(2)errno(3)execve(2)elf(5)credentials(7)ld.so (8)等等......并阅读Advanced Linux Programming

也许一些 C 库正在使用clonefork ,具体取决于对uname(2)的一些初始调用的结果

还可以阅读一些关于操作系统的好教科书

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM