by shigemk2

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

プロセスは子プロセスを作れる

fork(2)して子プロセスを作成できるお。
実行中のプロセスをコピーして新しいプロセスを作成できるのだ。
子プロセスは親プロセスのメモリのコピーであるため、
親プロセスが開いているファイルディスクリプタも同様に引き継ぐ。
というか、同じプロセスを参照しているのだ。

子プロセスのびっくりする例

if fork
  puts "entered the if block"
else
  puts "entered the else block"
end

これ実行したらこうなるのよ。

$ ruby argv.rb
entered the if block
entered the else block

なぜかというと、1回forkメソッドを使うと2回返ってくるからである。
forkメソッドは新しいプロセスを作るメソッドなので、
オリジナルのプロセスと新しいプロセスの両方に返り値を持つ。

puts "parents process pid is #{Process.pid}"
if fork
  puts "entered the if block from #{Process.pid}"
else
  puts "entered the else block from #{Process.pid}"
end
parents process pid is 44626
entered the if block from 44626
entered the else block from 44646

子プロセス側ではforkはnilを返すので、2度目の返り値を判定してelse文を通る形となる。

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