2013-05-03 7 views
5

私はちょうどexit(0)という子プロセスを持っています。ゾンビになった。親プロセスにwaitまたはwaitpidを付けずに削除する方法はありますか?ゾンビプロセスを待たずに削除C

R+ ./server //parent 
R+ ./server //child 
Z+ (server) //child zombie 
+0

これがどのようにC投稿であるか分かりません。おそらくUnixがC言語で作成されたからでしょうか? :) –

+0

なぜあなたは 'wait'や' waitpid'を使いたくないのですか? – FDinoff

+0

の場合、 'wait'は子プロセスが終了するまで親プロセスを停止させるためです。 –

答えて

5

最も簡単なのは親では無視SIGCHLDを作ることです。

注:少し速い&ダーティなアプローチで、子プロセスの終了ステータスや終了時を気にする必要はありません。あなたが本当に堅牢なアプリケーションの中で気にしているように気をつけたら、適切なシグナルハンドラ関数を作成することについてのもう一つの答えを見てください。

追加:これはUnixでは普遍的ではありませんが、少なくともLinuxでは動作します。 an UNIX FAQによると、POSIXでは未定義の動作です。 This Mac OS X man pageはこの動作がFreeBSD 5.0で導入され、OS Xで動作することを示唆しています。

+1

親プロセスが終了したときに子プロセスが(ゾンビではなく)離れることはありませんか?言い換えれば、ゾンビは親が出るまでではないのですか? 'SIGCHLD'シグナルを無視しても親プロセスが' waitpid'していると思うので、カーネルは子プロセスをzombifyしなければなりません(しかし、私はそれをテストしなかったので間違いかもしれません)。 –

+0

@BasileStarynkevitch段落と詳細を説明するリンクを追加しました。しかし、それが動作すると、終了した/終了した子プロセスは、本当にただ消えて、ゾンビは、待つことはできません。 – hyde

+0

しかし、子プロセスは即座に消滅するか、親プロセスが終了した場合にのみ終了しますか? –

6

あなたは(例えばsigaction(2)などを使用して...)SIGCHLD信号をキャッチすることができます。シグナルハンドラから安全に呼び出すことができる関数はごくわずかです。数回お読みくださいsignal(7) & signal-safety(7)シグナルハンドラの中で行うべきことは、volatile sigatomic_tフラグ(シグナルハンドラのの外側、例えばevent loopの外側)を設定することです。または、初期化時に、pipe(7)(独自のプロセスに)を設定し、信号ハンドラに数バイトを書き込むことができます(poll(2)他の場所での読み取り終了)。suggested by Qt

そしてwaitpid(2)はあなたの子プロセスを待つことはありません場合は、それがzombieなりWNOHANG

で停止しないように言わすることができます。

Advanced Linux Programmingを読んでください。それはプロセスに関する良い章を持っています。ただきれいに待っていたことを必要とせずに離れて行く子プロセスを終了し、その後

signal(SIGCHLD, SIG_IGN); 

2

あなたは、二重fork技術使用することができます

は、子、子プロセスを作成します。その後すぐに子プロセスを終了します。 このようにして、子プロセスはinitプロセスになります。 initプロセスは、終了時に自動的に子プロセスを待機します。

親は子プロセスの終了を待機する必要があるため、waitpidは削除されません。 子プロセスのライフタイムは常に最小限に抑えられているため、長いブロッキングなしに親からwaitpidを呼び出すことができます。

詳細については、this articleを参照してください。

関連する問題