2010-05-24 43 views
5

我想使用clone函数的命名空间功能。阅读手册页,似乎clone有很多我需要担心的复杂细节。克隆相当于叉?

是否有相当于clone的调用良好'fork()

我已经很熟悉fork,并认为如果我在clone的起点,我可以从那里添加标志和选项。

回答

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); 

在标志参数它的低字节用于指定要发送的信号,通知线程的父做这样的事情死亡或停止。我相信所有的实际标志都会打开与fork不同的开关。看看内核代码表明情况就是这样。

如果你真的想得到一些接近fork的东西,你可能想调用sys_clone,它不采用函数指针,而是返回两次,如fork

+0

我参加了代码潜水,因为我仍然不舒服,但看起来你是对的。我发现'clone'是'sys_clone'周围的一个非常薄的包装器,大多只是在新堆栈上调用'fn'所需的东西。 'sys_clone'实际上像'fork'一样返回,但不能直接调用,因为每个体系结构的签名是不同的。 'fork'实际上很胖:它执行回调函数,执行misc清理,但基本上只使用SIGCHLD。 (我想我无法模仿'fork'-extras。) – 2010-05-25 19:06:19

0

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

最接近克隆的调用是pthread_create(),它基本上是clone()的包装。 这不会让你获得fork()行为。

+1

好点。我不太关心'clone'和'fork'之间'fn'和'return'的区别。我的目标是了解如何获得相同的子过程特征(以及它们是什么)。无论如何,'pthread_create'不会给我提供命名空间标志。 – 2010-05-25 08:17:03

1

您可以使用fork()分支正常的子进程,然后使用unshare()创建新的命名空间。

命名空间有点奇怪,我看不到很多用例。

+1

看起来'unshare'只支持'clone'标志的一小部分。例如,我想使用'CLONE_NEWNET',并返回'EINVAL'。 – 2010-05-25 08:08:43