/var/log/study

つまり雑記

RubyのProcess.detachを学ぶ

タイトルの通り。

マルチプロセスなEchoサーバーをRubyで書く際に、なるべくRubyの便利機能を排除して書きたかった。

Echoサーバー程度だとそもそも規模が小さいのでほぼ問題なく書けるのだが、子プロセスの扱いだけを悩んでしまった。

特に子プロセスの終了を親側で待つ必要が無いが、子プロセスの状態を回収しないとゾンビプロセスが発生してしまう。

ゾンビプロセスが湧くのはプロセスを見たときにイマイチなので回避したい。 そんなときにRubyの便利機能 Process.detach を見つけた。

どんな方法で実現されているのか?を知りたいのでコードを見ることにする。

github.com

サーッと、 Rubyprocess.c というファイルを眺めていると、proc_detachProcess.detach の実装に相当していそう。

色々とコメントが付いている。

https://github.com/ruby/ruby/blob/trunk/process.c#L1132-L1175

雑に要約すると以下。

  • マルチプロセスなプログラムで親プロセスが、子プロセスのステータスを回収しないと、子プロセスがゾンビになるよ
  • それを防ぐために、 detach ではメインのスレッドと、子プロセスを待つスレッドを分けるよ
  • 子プロセスを明示的に待つ必要がない時に利用してね

コメントにユースケースとかデザインとかがしっかり書き込まれているのは便利。