From: nobu.nokada@... Date: 2003-01-25T18:00:08+09:00 Subject: Re: exit status, stderr and stdout Hi, At Sat, 25 Jan 2003 04:09:53 +0900, Daniel Bretoi wrote: > Hm, do you know if anyone intends to fix this or if it has been fixed in > newer versions? Previously attached one sometimes had left a zombie. --- lib/open3.rb Tue Jan 29 18:17:53 2002 +++ lib/open3.rb Sat Jan 25 17:54:33 2003 @@ -8,6 +8,6 @@ # -module Open3 - class Process < Module +module Process + class Child < Module def initialize(cmd, error = true) super(&nil) @@ -55,26 +55,33 @@ module Open3 ensure pi.each {|p| p.close unless p.closed?} - begin Process.waitpid(pid); rescue Errno::ECHILD; end + self.class.wait(pid) end end ObjectSpace.define_finalizer(self, self.class.finalizer(pid)) + pi end def wait - status = Process.waitpid(@pid) + status = self.class.wait(@pid) ObjectSpace.undefine_finalizer(self) status + end + + protected + def self.wait(pid) + ::Process.waitpid(pid) rescue Errno::ECHILD - nil end def self.finalizer(pid) - proc {begin Process.waitpid(pid); rescue Errno::ECHILD; end} + proc {wait(pid)} end end +end +module Open3 #[stdin, stdout, stderr] = popen3(command); def popen3(*cmd) - p = Process.new(cmd) + p = Process::Child.new(cmd) [p.writer, p.reader, p.error] end -- Nobu Nakada