以某种方式调用
因此,使用fork,子进程可以轻松地重用从父进程继承的数据。
fork
然后调用 unshare
更容易,因为许多参数通过 fork
复制,否则需要手动包装为 clone
。我的问题是,在调用 (1) 以不同命名空间分叉新进程的 clone
和 (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
的特性使我在创建新命名空间时节省了很多精力。