2016-11-29 19 views
1

forkunshareを呼び出す方が簡単です。forkによって多くの引数がコピーされます。それ以外の場合は、手動でcloneにラップされるためです。私の質問は、(1)別の名前空間で新しいプロセスをフォークするcloneと(2)fork+unshareを呼び出して新しいプロセスをフォークし、親の名前空間を残すという違いとは何か。 cloneunshareに渡されるすべての名前空間フラグが同じであると仮定します。クローンとフォークの違い+シェア解除

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という性質は、両方とも新しい名前空間でプロセスを作成できるように多くの努力を惜しまない。

答えて

0

何とかして、フォークを呼び出して、共有解除するほうが簡単です。フォークを介してコピーされる多くの引数は、クローンに手動でラップされるためです。

これは、libcラッパー機能の場合にのみ該当します。
基盤となるシステムコールは()よりフォークのようなもので、おそらくこのケースでより良い仕事になります。

long flags = CLONE_NEWUSER | ... | SIGCHLD; 
long pid = syscall(__NR_clone, flags, 0, 0, 0, 0); 

if(pid == 0) { 
    /* child with unshared namespaces */ 
} 

クローンシステムコールが導入された程度の時間、フォーク(ので)フラグを使用してクローンだけの特別な場合であります= SIGCHLDと他のすべての引数は0です。

おそらく、同じフラグを渡すだけで、フォーク/シェア解除ペアを好む理由はありません。

関連する問題