不知何故,它更容易调用fork
,然后unshare
因为许多参数是通过复制fork
的,否则会被手动包装到clone
. clone
我的问题是,(1)调用在单独的命名空间中分叉一个新进程和(2)fork+unshare
分叉一个新进程然后离开父命名空间有什么区别。假设传递给clone
和的所有命名空间标志unshare
都是相同的。
auto flag = CLONE_NEWUSER | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWNET | SIGCHLD;
因此,使用 fork,孩子很容易重用从父母那里继承的数据。
int mydata; // this could be even more complicated, class, struct, etc.
auto pid = fork();
if(pid == 0) {
// reuse inherited data in a copy-on-write manner
unshare(flag);
}
对于克隆,我们有时必须将数据包装到另一个结构中并将其传递void*
给clone
系统调用。
int mydata;
clone(func, stack+stack_size, flag, &wrapper_of_data);
在我看来,在上面的例子中,唯一的区别是性能下降,而 fork 可能会更贵一些。但是,fork
两者都可以在新的命名空间中创建进程的方式为我节省了很多精力。