首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我在C中调用fork()而让sys_clone() syscall呢?为什么不使用sys_fork() syscall?

为什么我在C中调用fork()而让sys_clone() syscall呢?为什么不使用sys_fork() syscall?
EN

Stack Overflow用户
提问于 2021-03-30 20:52:00
回答 2查看 74关注 0票数 0

下面是我的源码test.c:

代码语言:javascript
复制
#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;

}

我是通过以下方式编译的:

代码语言:javascript
复制
gcc test.c -o fork

我发现它用sys_clone() syscall代替了sys_fork()。

代码语言:javascript
复制
$strace -o my ./fork
new process
old process
代码语言:javascript
复制
$cat my | grep clone
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f459f17d810) = 4415
代码语言:javascript
复制
$cat my | grep fork
execve("./fork", ["./fork"], 0x7ffc76ccbf00 /* 52 vars */) = 0

请参见脚本中的clone()?为什么不使用fork呢?

EN

回答 2

Stack Overflow用户

发布于 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

票数 1
EN

Stack Overflow用户

发布于 2021-03-30 20:56:17

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

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

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

可能一些C库正在使用clonefork,这取决于对uname(2)的一些初始调用的结果

也可以阅读一些good textbook on operating systems

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66871317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档