From: Tomoaki NISHIYAMA Date: 2005-04-27T11:06:10+09:00 Subject: [ruby-dev:26105] close(2) without flushing buffer for redirection in child process ruby-devの皆様 子プロセスの標準出力をリダイレクトするために、 fork{ STDOUT.reopen(io) exec("/path/to/commnad") } のようなことをしようとすると、reopenのところで、STDOUTのバッファがflush されて、親プロセスの分と2重に非同期に出力されることになって不都合です。 forkのまえに、flushしておけば回避できそうですが、バッファを出力せず、 強制的にclose(2)を呼び出すことができれば、スムーズにリダイレクトできそうです。 現状では、もちろん、syscall(6,1)とかを発行する事ができますが、 番号にポータビリティが保証されていないので、rubyからclose_fd! のような関数で、バッファーをflushせずに、特定のfile descriptorを 解放できるといいと思います。 あるいは、reopen!だとバッファーをflushしないなどの手も考えられるかもしれません。 いかがでしょう。 -- 西山智明