In message <1010981727.072489.8304.nullmailer / ev.netlab.jp>
matz / ruby-lang.org writes:

> |1.7.x のどこかから PTY.spawn は子プロセスの監視にスレッドを使うように
> |なりました.
> |
> |IO#expect は IO.select を使ってタイムアウト付きの expect を実装してい
> |ます.
> |
> |スレッドを使うと select() がスレッドのスケジューリングと干渉して,使え
> |る fd がなくても帰ってきてしまう場合があります.
> |
> |# これは ruby-talk ですでに報告されていて,patch がとりこまれています
> |# が完全な fix はまだだったはず?
> 
> 再現する情報がなくて直せません。ぐすん。

実のところきちんと検証したわけではないので原因がこの通りであるとは限り
ませんし,もしかしたら過渡的なものでもう直ってるのかもしれませんが....

    > cat .rb
    require "pty"
    require "expect"
    
    begin
      PTY.spawn("sh") do
        |rf, wf|
        begin
          rf.expect(/\$/)
        rescue Exception
          puts $!
        end
      end
    rescue PTY::ChildExited
      # ignore
    end
    > ruby -v .rb
    ruby 1.7.2 (2001-12-19) [i386-freebsd]
    undefined method `chr' for nil
    ^C.rb:10:in `join': Interrupt
            from .rb:10:in `spawn'
            from .rb:5

こんな感じです.

# 1001   725   543   0   2  0  2436 1980 select S+    p0    0:00.06 ruby -v .rb
# っていう感じではまってしまうんで interrupt で止めてる.


-- 
柳川和久 @ 東大阪市 . 大阪府                               January 14, 2002
Every body's business is nobody's business.