From: Takaaki Tateishi Date: 2000-10-20T04:58:09+09:00 Subject: [ruby-list:25538] open3.rb 立石です. open3.rbについての修正案です. Open3.popen3では,forkを行なってexecすることで3つの入出力を獲得 していますが,waitをかけていないために,waitを忘れると,ゾンビが 大量に発生してしまうことがありました. # mod_rubyを使ってる時にやってしまいました.(x_x; そこで,以下のようにしてみたのですが,どうでしょうか? popen3(hogehoge) do |fin,fout,ferr| ... end という感じに使うことができます. module Open3 #[stdin, stdout, stderr] = popen3(command); def popen3(cmd) pw = IO::pipe # pipe[0] for read, pipe[1] for write pr = IO::pipe pe = IO::pipe res = nil pid = fork if pid == nil then # child pw[1].close STDIN.reopen(pw[0]) pw[0].close pr[0].close STDOUT.reopen(pr[1]) pr[1].close pe[0].close STDERR.reopen(pe[1]) pe[1].close exec(cmd) exit else pw[0].close pr[1].close pe[1].close if( iterator? ) begin yield(pw[1], pr[0], pe[0]) ensure pw[1].close if( ! pw[1].closed? ) pr[0].close if( ! pr[0].closed? ) pe[0].close if( ! pe[0].closed? ) Process.waitpid(pid,0) end res = nil else res = [pw[1], pr[0], pe[0]] end end res end module_function :popen3 end