けいじゅ@日本ラショナルソフトウェアです.

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 <<---