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;
したがって、フォークでは、親が継承したデータを再利用することが非常に簡単です。
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);
}
クローンのために、私たちは時々、別の構造体にデータをラップし、clone
システムコールにvoid*
としてそれを渡す必要があります。
int mydata;
clone(func, stack+stack_size, flag, &wrapper_of_data);
唯一の違いは、フォークは少し高価になることができ、パフォーマンスヒット、である上記の例のように思えます。しかし、fork
という性質は、両方とも新しい名前空間でプロセスを作成できるように多くの努力を惜しまない。