forkした子プロセスを後始末する簡単な方法
forkした子プロセスを後始末する簡単な方法。
それは、signal(SIGCHLD, SIG_IGN); を呼んでおくこと。
サンプルプログラムをコピペしたらすでにそうなってた。
- tetsu_koba
- 6310
- 0
- 6
- 0
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
鯉江
@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
@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
最初はこのページを見て真似した。zombie problem のことも説明があったのにすっかり忘れてた。 http://t.co/7sLUeEO8
2012-04-04 13:19:10