forkした子プロセスを後始末する簡単な方法

forkした子プロセスを後始末する簡単な方法。 それは、signal(SIGCHLD, SIG_IGN); を呼んでおくこと。 サンプルプログラムをコピペしたらすでにそうなってた。
2
koba @tetsu_koba

forkした子プロセスが終了したときに、wait系システムコールを呼んで後始末しないとプロセステーブルの残骸が残ったままになると習った。ゾンビプロセス。

2012-04-04 12:31:47
koba @tetsu_koba

自分のプログラムではforkしたけどwaitしてない。それでもps axで見てもゾンビプロセスはいないようだ。これはinitが後始末してくれたから?それともSIGCHLDのデフォルトのシグナルハンドラがよしなに処理してくれたから?

2012-04-04 12:34:47
ぬん。 @amasawa_seiji

@tetsu_koba そのforkした側のプロセスが終了していたらinitが処理しますね。

2012-04-04 12:36:44
鯉江 @koie

@tetsu_koba SIGCHLDをSIG_IGNにしたりSA_NOCLDWAITを設定したりすると成仏します。manみたらPOSIX (B.3.3.1.3) disallows setting the action for SIGCHLD to SIG_IGN. 知らんかた

2012-04-04 12:54:25
koba @tetsu_koba

@amasawa_seiji 親プロセスはまだ生きてます。

2012-04-04 12:56:53
koba @tetsu_koba

@koie straceでみたらmain関数にいく前にrt_sigactionが呼ばれてSIGCHLDがSIG_IGNにセットされた。@tetsu_koba SIGCHLDをSIG_IGNにしたりSA_NOCLDWAITを設定したりすると成仏します

2012-04-04 13:00:37
koba @tetsu_koba

いや違った。mainの中でSIGCHLDをSIG_IGNにセットしてた。サンプルプログラムをコピペした部分だ。 @koie straceでみたらmain関数にいく前にrt_sigactionが呼ばれてSIGCHLDがSIG_IGNにセットされた。

2012-04-04 13:04:43
koba @tetsu_koba

main関数の最初にやってたsignal(SIGCHLD, SIG_IGN)をコメントアウトしてみた。ps でみたらゾンビプロセスができた! なるほど。

2012-04-04 13:09:59
koba @tetsu_koba

ゾンビプロセスができて喜んでどーするて感じだけど、因果関係が理解できてよかった。

2012-04-04 13:12:31
koba @tetsu_koba

最初はこのページを見て真似した。zombie problem のことも説明があったのにすっかり忘れてた。 http://t.co/7sLUeEO8

2012-04-04 13:19:10