只今Ruby勉強中

プログラミングRuby―達人プログラマーガイド

うさぎさんと一緒にRubyの勉強をしているオレの記録。

間違ってる所とかいっぱいあると思いますけど、誰でもコメント出来るので気軽に教えて下さい。

普段は 鷹の島 って所で書いてます。

現在のハマリポイント - yield, succ?, Proc & 後で

2006-08-24 (Thu)

js 23:17  js - 只今Ruby勉強中 を含むブックマーク

Javascript がセミコロン使わないでも書けるようになれば良いのに。あと Perl も。

子プロセス 23:24  子プロセス - 只今Ruby勉強中 を含むブックマーク

うさぎ本: p148

(pig とグラフで遊んでたら大分差が開いた。)

子プロセスの終了を待って実行するプログラムの例。サンプル通りに実行してみる。

irb(main):001:0> trap("CLD") {
irb(main):002:1* pid = Process.wait
irb(main):003:1> puts "Child pid #{pid}: terminated"
irb(main):004:1> exit
irb(main):005:1> }
=> nil
irb(main):006:0> exec('sleep 3') if fork == nil
=> nil
irb(main):007:0> Child pid 28189: terminated

fork

これだけじゃ良くわからんので、色々テストして遊んでみる事にする。

例えばこんな感じで実行すると。

puts 'start'

sleep 5 if fork == nil

puts 'waiting...'
Process.wait
puts 'done'

エラーになってしまう。

start
waiting...
waiting...
my.rb:15:in `wait': No child processes (Errno::ECHILD)
        from my.rb:15
done

fork したプロセスが sleep 以降も実行してるって感じか?

子プロセスを終わらせると期待通りに動く。

puts 'start'

if fork == nil
   sleep 5
   exit
end

puts 'waiting...'
Process.wait
puts 'done'

実行。

start
waiting...
done

sleep の所を exec('sleep 5') とかでやると exit しなくても平気。

puts 'start'

if fork == nil
   exec('sleep 3')
end

puts 'waiting...'
Process.wait
puts 'done'

それならと。

puts 'start'

if fork == nil
   puts 'fork'
   exec('sleep 3')
   puts 'fork'
end

puts 'waiting...'
Process.wait
puts 'done'

これを実行すると。

start
fork1
waiting...
done

こうなった。

動きは理解出来た、と思う。


fork なブロック 23:52  fork なブロック - 只今Ruby勉強中 を含むブックマーク

うさぎ本: p149

とりあえずお約束。

irb(main):001:0> IO.popen("date") { |f| puts f.gets }
2006824日 木曜日 23:46:13 JST
=> nil

LANG はシェルの環境変数を引き継いでんだね。

で、fork のブロックのサンプルコード。

fork do
   puts "In child, pid = #$$"
   exit 99
end

pid = Process.wait
puts "Child terminated, pid = #{pid}, exit code = #{$? >> 8}"

なーんだ、さっき散々悩んだのにこのページで答えがほぼ出てるし。fork do はわかりやすくて良い。

そんで実行結果。

In child, pid = 28794
Child terminated, pid = 28794, exit code = 99

ついで

fork do の場合は exit しなくても平気。

fork do
   puts "In child, pid = #$$"
end

pid = Process.wait
puts "Child terminated, pid = #{pid}, exit code = #{$? >> 8}"

実行。

In child, pid = 28864
Child terminated, pid = 28864, exit code = 0
トラックバック - http://rubyist.g.hatena.ne.jp/gaba/20060824