by shigemk2

当面は技術的なことしか書かない

競合状態

# -*- coding: utf-8 -*-
2.times do
  fork do
    # いずれもすぐ終了する
    abort "Finished!"
  end
end

# 親プロセスは最初のプロセスの終了を待ってから、5秒間スリープする。
# スリープしている間に 2つ目の子プロセスが終了してしまうが、
# その時親プロセスはスリープ中である

puts Process.wait
sleep 5

# 親プロセス側で再びwaitを呼び出す
# すると不思議なことに、キューに溜まっていた2つめの
# 子プロセスの終了情報がここに返ってくる
puts Process.wait

Finished!
Finished!
59341
59342

  1. 親プロセス作成
  2. 子プロセス2つ作成→すぐ終了!!
  3. 最初のプロセスが終了してから親プロセスは5秒間待つ

このテクニックでは競合状態は発生しない。
カーネルは終了したプロセスの情報をキューに入れておくため、
親プロセスは子プロセスの終了時点の情報を必ず受け取る事が出来るお。

http://tatsu-zine.com/books/naruhounix