読者です 読者をやめる 読者になる 読者になる

なるほどUnixプロセス読書記録(3)

さあついに3日目です(ここで読書記録が終わると3日坊主ということになりますね)

 

16章まで読んで以下を理解した

 

  • デーモンプロセスは意図的に孤児(orphan)化されたプロセス
  • Unixシステムでは、親プロセスと子プロセスいずれかでメモリを変更する必要が生じたときだけメモリをコピーするコピー・オン・ライトで親子プロセスの独立性を保っている
  • Ruby(MRI)の1.9以下のバージョンではCoWフレンドリな作法でforkが実装されていない(ここ、私の表現が怪しい気がする)
  • Process#waitは子プロセスのどれか1つが終了するまでの間、親プロセスをブロックして待つ
  • Process#waitは終了した子プロセスのpidを返す
  • 終了した子プロセスのpidと終了ステータスの2つを返すのがProcess#wait2
  • 特定の子プロセスの終了を待つ場合はProcess#waitpid、Process#waitpid2がある
  • 子プロセスがゾンビにならないようProcess#detachでデタッチして、専用スレッドで指定プロセスの終了を待ち続ける
  • Process#waitの第2引数にProcess::WNOHANGを指定することで、終了を待つ子プロセスがいなければブロックしないようカーネルに指示することができる(このへん後でまた読み直した方がよさそう)
  • シグナルは再定義できる
  • 開発者が用途を決める(再定義する)目的で用意されているSIGUSR1とSIGUSR2の2つのシグナルがある
  • シグナルは無視できる
  • Kernel#trapは大筋sigaction(2)に対応している(あとで詳しく調べよう)

 

(疑問)

複数の子プロセスを生成して、子プロセスの数分ループを回してProcess#waitしたときに、1つめの子プロセスが終了してProcess#waitが戻ってきてから次のProcess#waitを呼ぶまでの間に子プロセス終了したとして、そのときどういう風に動いているんだろう…

→読み進めていたら答えが書いてあった。

 カーネルは終了したプロセスの情報をキューに入れておくから、親プロセスは順次終了した子プロセスの情報を得ることができるそうだ

 

当然出てくる疑問とはいえ、ちゃんと疑問に思えたことが良かった