FC2ブログ

rubyのforkでZombieプロセスを出さないために

rubyのforkで子プロセスを起こした際、親プロセスでProcess.waitを呼んであげないとZombieプロセスになってしまう。そのため

・親プロセスから子プロセスをfork。親プロセスでProcess.wait
・子プロセスから孫プロセスをfork。子プロセスでexit!
・孫プロセスのpidを親プロセスに通知。孫プロセスの終了を親プロセスで管理

などというテクニックが一般的(?)のようだ。こうしないと子プロセスを待てないし、単純に子プロセスの終了を待とうとするとマルチプロセスプログラムにならない。

最近のruby(1.7以降)であれば、Process.detach を呼ぶことで上記の問題を解決できる模様。子プロセスを待つ別スレッドを生成してるようで、単純に親プロセス側で Process.detach を呼べばDefunctなプロセスが残ることはない。

rubyのマニュアルで Thread.value というモジュールを呼んだサンプルが紹介されている。Thread.value はスレッドの終了を待つメソッド。親プロセスでうっかり Thread.value を呼んでしまうとスレッドが終了するまで(子プロセスが終了するまで)value が返ってこなくなることに注意。
# ちなみに自分はそれで少し悩みました...orz

Comment

Comment Form
公開設定

Trackback


→ この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。