けいじゅ@日本ラショナルソフトウェアです. In [ruby-list :28200 ] the message: "[ruby-list:28200] Re: question of pipe , thread and queue ", on Feb/24 02:59(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >たぶん、threadとforkを組み合わせてるのがイカンのでは? >現在disableにしてる fork_and_kill_other_threads を on にする >とこの問題は発生しないようです。 うぅ. デフォルトの動作はこれじゃなかったんでしたっけ? # 一応フォローしていたつもりだったんだけどなぁ... あ. あと 1.6.2では Thread.fork_and_kill_other_threads とかってないわけですよね? デフォルトの動作がforkしてもスレッドが生き残るようになっているんだとする と, 今の作りは悪いですね. フォークした先のスレッドが先に動き出す可能性も ありますので.... で, 実際に確かめたらそうでした(^^;;; 解決策として, どうせすぐexecしてしまうんだから def initialize(com) @com = com @pipe_me_in, @pipe_peer_out = IO.pipe @pipe_peer_in, @pipe_me_out = IO.pipe Thread.critical = true # <--------------------- ここと @pid = fork { @pipe_me_in.close @pipe_me_out.close STDIN.reopen(@pipe_peer_in) STDOUT.reopen(@pipe_peer_out) exec(com) } Thread.critical = false # <-------------------- ここ Thread.start do begin Process.waitpid(@pid, nil) rescue Errno::ECHILD end end としました. そしたらちゃんと動くようになりましたが... 良く考えたら, 必要ないIOをクローズしていないんですね. それではちょっと行 儀が悪いかなと... 過去のMLにもこの話題がありましたが, 推薦解がよくわかり ませんでした. 推薦解としてはどういうものがあるでしょう? __ ..............................石塚 圭樹@日本ラショナルソフトウェア... ----------------------------------->> e-mail: keiju / rational.com <<---