2010年8月10日10:53 Yui NARUSE <redmine / ruby-lang.org>: > > 以下のプログラムが FreeBSD で終了しません。 > (test/ruby/test_rubyoptions.rb の test_script_from_stdin より) > Ubuntu 8.04 や Mac OS X 10.6 では終わることを確認しています。 単純化してみました。 パイプは関係ありません。 freebsd8(16:07:56)% cat z.rb require 'pty' PTY.getpty('sleep 1') do |r, w, pid| p pid w.print("a") Process.wait pid end puts :fin freebsd8(16:07:58)% ./ruby -v z.rb ruby 1.9.3dev (2010-08-07 trunk 28906) [i386-freebsd8.1] 32576 (ここでハング) 他の端末から ps してみると、以下のようになります。 freebsd8(16:07:25)% ps u32576 USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND akr 32576 0.0 0.1 1536 504 7- SEs+ 4:07PM 0:00.00 sleep 1 STAT の意味は S Marks a process that is sleeping for less than about 20 seconds. E The process is trying to exit. s The process is a session leader. + The process is in the foreground process group of its control terminal. ということで、E のままで終わらないのがわかりません。 また、sleep 1 を ktrace sleep 1 にして kdump すると、 freebsd8(16:18:10)% kdump -E ... 33428 sleep 0.001572 RET sigprocmask 0 33428 sleep 0.001611 CALL nanosleep(0xbfbfeaac,0) 33428 sleep 1.001607 RET nanosleep 0 33428 sleep 1.001672 CALL sigprocmask(SIG_BLOCK,0x2807acc0,0xbfbfea10) 33428 sleep 1.001681 RET sigprocmask 0 33428 sleep 1.001688 CALL sigprocmask(SIG_SETMASK,0x2807acd0,0) 33428 sleep 1.001693 RET sigprocmask 0 33428 sleep 1.001712 CALL sigprocmask(SIG_BLOCK,0x2807acc0,0xbfbfe9d0) 33428 sleep 1.001718 RET sigprocmask 0 33428 sleep 1.001723 CALL sigprocmask(SIG_SETMASK,0x2807acd0,0) 33428 sleep 1.001742 RET sigprocmask 0 33428 sleep 1.001757 CALL exit(0) というように nanosleep で 1秒待った後、exit(0) を呼んでいるようなのが 観察されます。 -- [田中 哲][たなか あきら][Tanaka Akira]