2017-01-02 16 views
1

manページは言う:フォークとは異なりlinux c: "fork"の代わりに "clone"関数が必要なのはいつですか?

(2)、クローン()などのメモリ スペース、ファイルのテーブルとして、呼び出しプロセスとその 実行コンテキストの一部を、共有するために子プロセスを可能に記述子、シグナルテーブル ハンドラが含まれています。私は理解していないが、「ファイルディスクリプタのテーブルである

(通常 は「親プロセス」に対応しています。しかし、以下の CLONE_PARENTの説明を参照してください。「プロセスを呼び出す」、このマニュアルページになお)私はフォークを使用する場合ので、私は以下のテストのように」、子供はもちろん、父のプロセスによって開かれていますFDに書き込むことができます。

$ cat myfork.cpp 
#include<fcntl.h> 
#include<unistd.h> 
int main() 
{ 
    int f1=open("./test.txt",O_CREAT|O_RDWR); 
    pid_t id=fork(); 
    if(id>0)//father 
    { 
    sleep(1); 
    for(size_t i=0;i<10;++i) 
    { 
     sleep(2); 
     write(f1,"father write1\n",14); 
    } 
    } 
    else//child 
    { 
    for(size_t i=0;i<10;++i) 
    { 
     sleep(2); 
     write(f1,"child write1\n",13); 
    } 
    } 
    close(f1); 
    return 0; 
} 

実行した結果は次のとおりです。

$ cat test.txt 
child write1 
father write1 
child write1 
father write1 
child write1 
father write1 
child write1 
father write1 
child write1 
father write1 
child write1 
father write1 
child write1 
father write1 
child write1 
father write1 
child write1 
father write1 
child write1 
father write1 

両方のプロセスが順番に同じファイルに書き込むことができるので、 "forked"プロセスもfdテーブルを共有できることを理解できますか?次に、「クローン」機能の必要性は何ですか?

答えて

4

テーブルは共有されず、コピーされます。 forkの後、各プロセスには独自のファイル記述子テーブルがあります。

スレッドのようなものを実装するには、両方のスケジューリングエンティティでファイル記述子の変更が見られるように、テーブルを共有する必要があります。

+2

もっと簡単に言えば、 'clone'は本当に実装者をスレッドするためにのみ役に立ちます(POSIXスレッドのようなライブラリを書いている人は少なく、* POSIXスレッドを使用する人は多くありません) –

関連する問題