2011-11-22 15 views
12

私は私のメインプログラムと分かれた子供がいるこの奇妙な行動に入っています。親を殺すフォークされた子は親を殺すか?

___parent___ 
|   |      ____child_____ 
| 0 stdin |     |    | 
| 1 pipe1[1]----------.   | 1 stdout | 
| 2 pipe2[1]----------.\   | 2 stderr | 
|____________|   \`----------> 3 pipe1[0] | 
         `----------> 5 pipe2[0] | 
            |______________| 

だから、親はSTDINから入力を取得しますが、2本のパイプにSTDOUTstderrををリダイレクトします:彼らは、この(数字はファイル記述子である)のように配管されています。子供はstdinを閉じて、代わりにパイプの読み込み端を使用します。

その後、私はちょうど子供を殺すために機能を持っている:

void killChild(){ 
    printf("Killing %d\n", (int)childID); 
    fflush(stdout); 
    kill(childID, SIGKILL); 
    waitpid(childID, NULL, 0); // getting rid of the zombie 
} 

子が正常に殺されたが、問題は親自身が同様殺さということです。私は子供のPIDをチェックし、それは正しいです。

なぜ親は死んでいるのですか?

+5

私はこの質問の名前が大好きです。そして芸術。 – Gabe

+3

親はどの信号を受け取りましたか? – hochl

+5

親は子を殺した後にstdoutまたはstderrに書き込みを試みますか?もしそうなら、それはSIGPIPEのために死にます。あなたはSIGCHLDの取り扱いを変更していますか? –

答えて

13

子が終了した後、親がfd1またはfd2に書き込むと、カーネルは親にSIGPIPEを送信します。 SIGPIPEのデフォルトの動作はプロセスの終了です。それはおそらく起こっていることです。

+1

それは本当に問題でした。親のパイプを閉じる()だけで解決しました。今、stdoutとstderrをリセットする方法を見つけなければなりません。 – Pithikos

+3

パイプを作成する前に@Pithikos dup()stdout/stderr。パイプを閉じた後、dup2()を再びファイル記述子1/2に戻します。 – nos

2

SIGPIPESIGCHLDシグナルを処理する必要があります。無視しても問題ありません。

+2

そしておそらく終了した子供たち、ゾンビを待つことは良い考えです... – hochl

+1

彼はすでにそれをしているので、私はそれについてコメントしませんでした。 – pajton

関連する問題