克隆(Clone)与fork相当吗?

6
我想使用clone函数的命名空间功能。阅读手册,似乎clone有许多复杂的细节需要关注。
是否有与经典的fork()相当的clone调用?
我已经熟悉了fork,并且认为如果我有一个clone的起点,我可以从那里添加标志和选项。
3个回答

2

我认为这个会起作用,但是我对一些指针参数并不完全确定。

pid_t child = clone( child_f, child_stack, 
           /* int flags                */     SIGCHLD, 
           /* argument to child_f      */     NULL,
           /* pid_t *pid               */     NULL,
           /* struct usr_desc * tls    */     NULL,
           /* pid_t *ctid              */     NULL );

在flags参数中,它的低字节用于指定要发送哪个信号以通知执行线程的父线程正在进行类似死亡或停止的操作。我认为所有实际标志都会打开与fork不同的开关。查看内核代码表明这是正确的。
如果您真的想获得与fork接近的东西,您可能需要调用sys_clone,它不需要函数指针,而是像fork一样返回两次。

我进行了代码调试,因为我仍然感到不舒服,但看起来你是对的。我发现clone只是一个非常薄的包装器,主要是做必要的工作来在新堆栈上调用fnsys_clone实际上像fork一样返回,但不能直接调用,因为它的签名因架构而异。 fork实际上相当臃肿:它执行回调,进行杂项清理,但基本上只使用SIGCHLD。(我想我无法模拟fork的额外功能。) - Stéphan Kochen

1
你可以使用fork()来复制一个正常的子进程,然后使用unshare()创建一个新的命名空间。
命名空间有点奇怪,我看不出有很多用例。

1
看起来 unshare 只支持 clone 标志的一小部分。例如,我想使用 CLONE_NEWNET,但它返回 EINVAL - Stéphan Kochen

0

clone() 用于创建线程。clone() 和 fork() 的最大区别在于,clone() 是为了从一个单独的入口点 - 函数开始执行,而 fork() 只是从调用它的代码中的同一点继续向下执行。在 manpage 定义中的 int (*fn)(void *) 是函数,退出时返回一个 int 值,即退出状态。

与 clone 最接近的调用是 pthread_create(),它本质上是 clone() 的包装器。但这并不能让你获得 fork() 的行为。


1
好的观点。我不太关心clonefork之间的fnreturn差异。我的目标是了解如何获得相同的子进程特性(以及它们是什么)。无论如何,pthread_create都没有为我提供命名空间标志。 - Stéphan Kochen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接