【发布时间】:2010-05-24 16:41:04
【问题描述】:
我想使用clone 函数的命名空间功能。阅读手册页,clone 似乎有很多我需要担心的复杂细节。
是否存在与 fork() 等效的 clone 调用?
我已经熟悉fork,并且相信如果我在clone 有一个起点,我可以从那里添加标志和选项。
【问题讨论】:
我想使用clone 函数的命名空间功能。阅读手册页,clone 似乎有很多我需要担心的复杂细节。
是否存在与 fork() 等效的 clone 调用?
我已经熟悉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 );
在 flags 参数中,它的低字节用于指定发送哪个信号来通知线程的父线程正在执行诸如死亡或停止之类的事情。我相信所有实际的标志都会打开不同于fork 的开关。查看内核代码表明情况就是这样。
如果您真的想获得接近fork 的东西,您可能需要调用sys_clone,它不使用函数指针,而是像fork 一样返回两次。
【讨论】:
clone 是sys_clone 的一个非常薄的包装器,主要只是在新堆栈上执行调用fn 的必要操作。 sys_clone 实际上像 fork 一样返回,但不能直接调用,因为它的签名因架构而异。 fork 实际上相当胖:它执行回调,进行杂项清理,但基本上只使用 SIGCHLD。 (我想我无法模仿fork-extras。)
您可以使用 fork() fork 一个普通的子进程,然后使用 unshare() 创建一个新的命名空间。
命名空间有点奇怪,我看不到它们的很多用例。
【讨论】:
unshare 只支持clone 标志的一小部分。例如我想使用CLONE_NEWNET,它返回EINVAL。
clone() 用于创建线程。 clone() 和 fork() 之间的最大区别在于 clone() 意味着从一个单独的入口点开始执行 - 一个函数,而 fork() 只是从调用代码的同一点继续向下执行。手册页定义中的 int (*fn)(void *) 是函数,它在退出时返回一个 int,即退出状态。
最接近clone 的调用是pthread_create(),它本质上是clone() 的包装器。 这不会让您获得获取 fork() 行为的方法。
【讨论】:
fn 与return 之间clone 和fork 之间的区别。我的目标是了解如何获得相同的子流程特征(以及它们是什么)。在任何情况下,pthread_create 都不会为我提供命名空间标志。