From: nobu.nakada@... Date: 2000-10-22T01:47:47+09:00 Subject: [ruby-list:25566] Re: open3.rb なかだです。 At Sun, 22 Oct 2000 01:01:22 +0900, Takaaki Tateishi wrote: > > |> そおかあ、1秒後にProcess.waitpidするとかでどうでしょう? > > | > > | 子がさらに fork して孫を作ってすぐに死んでやると、親はすぐに > > |子の亡骸を wait で回収でき、孫は死んだ時点で orphan となるので > > |init に回収されると思います。 > > > > その方がスマートですね。そうしましょう。 > > ありがとうございます.おかげで助かります. > ついでに,ブロック付きで呼ばれたときには抜けるときにclose > もやって欲しいなと思うのですがどうでしょうか? ついでに引数を exec と揃えたりってのはどうでしょう。 Index: open3.rb =================================================================== RCS file: /home/cvs/ruby/lib/open3.rb,v retrieving revision 1.4 diff -u -2 -p -r1.4 open3.rb --- open3.rb 2000/10/20 16:37:01 1.4 +++ open3.rb 2000/10/21 16:28:49 @@ -10,5 +10,5 @@ module Open3 #[stdin, stdout, stderr] = popen3(command); - def popen3(cmd) + def popen3(*cmd) pw = IO::pipe # pipe[0] for read, pipe[1] for write pr = IO::pipe @@ -17,4 +17,6 @@ module Open3 pid = fork{ # child + fork and _exit + pw[1].close STDIN.reopen(pw[0]) @@ -29,6 +31,6 @@ module Open3 pe[1].close - exec(cmd) - _exit 127 + exec(*cmd) + exit! 127 } @@ -36,11 +38,12 @@ module Open3 pr[1].close pe[1].close - Thread.start do - sleep 1 - Process.waitpid(pid) - end + Process.waitpid(pid) pi = [ pw[1], pr[0], pe[0] ] if defined? yield - return yield *pi + begin + return yield *pi + ensure + pi.each {|p| p.closed? or p.close} + end end pi -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦