ファイルディスクリプタ

r,w = IO.pipe
pid = fork {
  STDOUT.reopen w
  exec "ls"
}

puts r.gets until r.eof?
Process.wait

上のようなプログラムを書いてはまってました。

問題は、子プロセスが終了しても、rがeofにならないこと。終了しないプログラムになってしまいます。


解決法は、親プロセスの方でもwをcloseしてあげれば良い。rubyのio.cを見てたら、やたらcloseしているのが見えたので、もしかして、と思ってw.closeをwhileの前に入れてやると、ちゃんと終了してくれました。Unixってもしかしてプロセスが終了するときにフィアルディスクリプタがcloseされるとは限らないとか!?とか思ってたのですが、さすがにそんなことはありませんでした。