6

私はただの子プロセスを持っていますexit(0)。ゾンビになりました。wait親プロセスなしで、または親プロセスでそれを削除する方法はありwaitpidますか?

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

3 に答える 3

7

SIGCHLDシグナルをキャッチできます(例: sigaction(2)などを使用)。注意してください。シグナルハンドラから安全に呼び出せる関数はほとんどありません。signal(7)signal-safety(7)を数回読み取ります。シグナル ハンドラの内部で行う良い方法は、何らかのvolatile sigatomic_tフラグを設定することです (これは後で、シグナル ハンドラの外部で、たとえばイベント ループでテストします)。または、 Qt で提案されているように、初期化時にpipe(7) (独自のプロセスへ) をセットアップし、シグナル ハンドラー (およびpoll(2)で他の場所の読み取り終了) に数バイトを書き込むこともできます。

そして、waitpid(2)は停止しないように指示できますWNOHANG

子プロセスをまったく待たないと、それはゾンビになります。

高度な Linux プログラミングを読んでください。プロセスに関する優れた章があります。

于 2013-05-03T17:05:23.700 に答える
6

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

signal(SIGCHLD, SIG_IGN);

その後、終了する子プロセスは、待機する必要なくきれいに消えます。

注: これは少し手っ取り早い方法であり、子プロセスの終了ステータスや、いつ終了するかを単に気にしないことを前提としています。実際の堅牢なアプリケーションではおそらく気にする必要があるので、気にする場合は、適切なシグナルハンドラー関数の作成に関する他の回答を参照してください。

追加: これは Unix では一般的ではありませんが、少なくとも Linux では機能します。UNIX FAQによると、これは POSIX では未定義の動作です。この Mac OS X の man ページは、この動作が FreeBSD 5.0 で導入され、たとえば OS X で動作することを示唆しています。

于 2013-05-03T17:15:24.450 に答える