clone fork linux,fork()内部调用clone()是否正确?

本文详细探讨了Linux系统中fork()函数的实现,实际上它依赖于clone()系统调用。在glibc中,fork()是clone()的包装器,通过在孩子进程中设置函数指针并调用clone()来实现。clone() syscall并不直接接收函数参数,而是从返回点继续执行,类似于fork()。文章分析了源代码,揭示了这一过程的细节,并澄清了关于clone()和fork()的一些常见误解。
摘要由CSDN通过智能技术生成

小编典典

对于此类问题,请始终阅读源代码。

从glibc

nptl/sysdeps/unix/sysv/linux/fork.c(GitHub)(nptl=

Linux的本地Posix线程)中,我们可以找到的实现fork(),它绝对 不是

syscall,我们可以看到魔术发生在ARCH_FORK宏内部,该宏定义为clone()in

nptl/sysdeps/unix/sysv/linux/x86_64/fork.c(GitHub)的内联调用。但是,等等,没有函数或堆栈指针传递给此版本的clone()!那么,这是怎么回事?

clone()接下来,让我们看一下glibc

中的实现。在sysdeps/unix/sysv/linux/x86_64/clone.S(GitHub)中。您可以看到它的作用是将函数指针保存在孩子的堆栈上,调用clone

syscall,然后新进程将读取从堆栈弹出的函数,然后对其进行调用。

所以它是这样的:

clone(void (*fn)(void *), void *stack_pointer)

{

push fn onto stack_pointer

syscall_clone()

if (child) {

pop fn off of stack

fn();

exit();

}

}

而且fork()是…

fork()

{

...

syscall_clone();

...

}

摘要

实际的clone()syscall不接受函数参数,它只是从返回点继续,就像fork()。因此clone()和和fork() 库函数

都是clone()syscall的包装器。

文献资料

我的手册副本是关于clone()库函数和系统调用的事实的一些预告。但是,我确实clone()在第2节中找到了误导,而不是在第2节和第3节中都发现了这种误解。

#include

int clone(int (*fn)(void *), void *child_stack,

int flags, void *arg, ...

/* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );

/* Prototype for the raw system call */

long clone(unsigned long flags, void *child_stack,

void *ptid, void *ctid,

struct pt_regs *regs);

和,

该页面同时描述了glibc clone() 包装函数和它所基于的基础系统调用。正文描述了包装函数;原始系统调用的差异将在本页尾进行描述。

最后,

原始clone()系统调用更紧密地对应fork(2)于子调用中的子进程继续执行。这样,将clone()省略包装函数的fn和arg参数。此外,参数顺序也会改变。

2020-06-03

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值