我想使用clone
函数的命名空间功能。阅读手册页,似乎clone
有很多我需要担心的复杂细节。克隆相当于叉?
是否有相当于clone
的调用良好'fork()
?
我已经很熟悉fork
,并认为如果我在clone
的起点,我可以从那里添加标志和选项。
我想使用clone
函数的命名空间功能。阅读手册页,似乎clone
有很多我需要担心的复杂细节。克隆相当于叉?
是否有相当于clone
的调用良好'fork()
?
我已经很熟悉fork
,并认为如果我在clone
的起点,我可以从那里添加标志和选项。
我认为这会起作用,但我对某些指针参数并不完全确定。
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
。
clone()用于创建线程。 clone()和fork()之间最大的区别在于clone()是为了从一个单独的入口点开始执行 - 一个函数,而fork()只是从调用的代码中的同一点继续向下。手册页定义中的int(* fn)(void *)是函数,它在exit上返回int,即退出状态。
最接近克隆的调用是pthread_create(),它基本上是clone()的包装。 这不会让你获得fork()行为。
好点。我不太关心'clone'和'fork'之间'fn'和'return'的区别。我的目标是了解如何获得相同的子过程特征(以及它们是什么)。无论如何,'pthread_create'不会给我提供命名空间标志。 – 2010-05-25 08:17:03
您可以使用fork()分支正常的子进程,然后使用unshare()创建新的命名空间。
命名空间有点奇怪,我看不到很多用例。
看起来'unshare'只支持'clone'标志的一小部分。例如,我想使用'CLONE_NEWNET',并返回'EINVAL'。 – 2010-05-25 08:08:43
我参加了代码潜水,因为我仍然不舒服,但看起来你是对的。我发现'clone'是'sys_clone'周围的一个非常薄的包装器,大多只是在新堆栈上调用'fn'所需的东西。 'sys_clone'实际上像'fork'一样返回,但不能直接调用,因为每个体系结构的签名是不同的。 'fork'实际上很胖:它执行回调函数,执行misc清理,但基本上只使用SIGCHLD。 (我想我无法模仿'fork'-extras。) – 2010-05-25 19:06:19