2011-10-23 12 views
5

私はメインプロセスを2回フォークして2つの子を作成しています。さて問題は、第二子が死ぬことはないということですフォークされた最後の子は死ぬことはありません

ls | more 

:2人の子供はこのようにお互いにパイプで連結されています。何故ですか?パイプの最後の子供はいつ本当に死ぬのですか?

wait()コールを削除すると、予想される結果はls | moreになりますが、それ以上の奇妙な動作(端末などの接続)が発生します。それは本当に死んでいませんmoreps axw

int main(){ 
    printf("[%d] main\n", getpid()); 
    int pip[2], i; 
    pipe(pip); 

    /* CHILDREN*/ 
    for (i=0; i<2; i++){ 
    if (fork()==0){ 

     /* First child */ 
     if (i==0){ 
     printf("[%d] child1\n", getpid()); 
     close(1); dup(pip[1]); 
     close(pip[0]); 
     execlp("ls", "ls", NULL);} 

     /* Second child */ 
     if (i==1){ 
     printf("[%d] child2\n", getpid()); 
     close(0); dup(pip[0]); 
     close(pip[1]); 
     execlp("more", "more", NULL);} 
    } 
    } 
    wait(NULL); // wait for first child 
    wait(NULL); // wait for second child 
    return 0; 
} 
+1

この質問のタイトルは非常に暴力的です。 – Marlon

+0

@マールロン・ハハは今までそれを見ていませんでした! – Pithikos

答えて

6

パイプの読み出し側EOFマークを取得することはありませんすべてのユーザーによって書き込み終了がクローズされるまで両方の子の親には依然としてパイプの両端が開いているので、moreはEOF(から0の戻り値)が表示されず、入力を待っています。

+0

ありがとうございました! – Pithikos

0

チェック:

は、ここに私のコードです。次に、waitのマニュアルページを読んでください。 waitの返品状況を見てください。

(ヒント:「ゾンビ」プロセスを引き起こすものを見て、私は待ってあなたは彼らが何を考えてやっているとは思わない。。)

+0

これも "ps aux | grep more"でやったことがあります。私は2番目の子供が生きているのを見ることができ、プロンプトはちょうど(子供を待って)ハングアップします。 – Pithikos

関連する問題