栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

从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 <sched.h>int clone(int (*fn)(void *), void *child_stack,          int flags, void *arg, ...           );long clone(unsigned long flags, void *child_stack,          void *ptid, void *ctid,          struct pt_regs *regs);

和,

该页面同时描述了glibc

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

最后,

原始

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/403210.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号