From: Takaaki Tateishi Date: 2000-10-23T16:15:35+09:00 Subject: [ruby-list:25581] Re: open3.rb --Multipart_Mon_Oct_23_16:13:52_2000-1 Content-Type: text/plain; charset=ISO-2022-JP 立石です. At Sun, 22 Oct 2000 01:47:47 +0900, nobu.nakada@nifty.ne.jp wrote: > > ついでに,ブロック付きで呼ばれたときには抜けるときに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 '_exit'と'waitpidの引数'がちょっと変でしたのでそこだけ修正 してmod_ruby使用時にゾンビが残らないことを確認しました. -- Takaaki Tateishi --Multipart_Mon_Oct_23_16:13:52_2000-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="open3.rb" Content-Transfer-Encoding: 7bit # Usage: # require "open3" # # in, out, err = Open3.popen3('nroff -man') # or # include Open3 # in, out, err = popen3('nroff -man') # 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 pid = fork{ # child fork and exit! 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! 127 } pw[0].close pr[1].close pe[1].close Process.waitpid(pid,0) pi = [ pw[1], pr[0], pe[0] ] if defined? yield begin return yield *pi ensure pi.each {|p| p.closed? or p.close} end end pi end module_function :popen3 end if $0 == __FILE__ a = Open3.popen3("nroff -man") Thread.start do while line = gets a[0].print line end a[0].close end while line = a[1].gets print ":", line end end --Multipart_Mon_Oct_23_16:13:52_2000-1--