読者です 読者をやめる 読者になる 読者になる

ファイルディスクリプタ

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されるとは限らないとか!?とか思ってたのですが、さすがにそんなことはありませんでした。