diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-02-28 06:11:11 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-02-28 06:11:11 +0000 |
commit | 7d51a12d9d547c6096f665f1cf9580eb24de6e4c (patch) | |
tree | 6165f98f4ad2901f6d087798f3388dc1e9dede1a /lib | |
parent | 15548a5a243d0ab989df17fcf881e2522ef69e3f (diff) |
* lib/open3.rb (Open3#popen3): use Thread.detach instead of
double-fork, so that the exit status can be obtained.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@26783 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r-- | lib/open3.rb | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/lib/open3.rb b/lib/open3.rb index fca0257cdd..ae3fffb40e 100644 --- a/lib/open3.rb +++ b/lib/open3.rb @@ -56,39 +56,37 @@ module Open3 pid = fork{ # child - fork{ - # grandchild - pw[1].close - STDIN.reopen(pw[0]) - pw[0].close + pw[1].close + STDIN.reopen(pw[0]) + pw[0].close - pr[0].close - STDOUT.reopen(pr[1]) - pr[1].close + pr[0].close + STDOUT.reopen(pr[1]) + pr[1].close - pe[0].close - STDERR.reopen(pe[1]) - pe[1].close + pe[0].close + STDERR.reopen(pe[1]) + pe[1].close - exec(*cmd) - } - exit!(0) + exec(*cmd) } pw[0].close pr[1].close pe[1].close - Process.waitpid(pid) + waiter = Process.detach(pid) pi = [pw[1], pr[0], pe[0]] + result = pi + [waiter] pw[1].sync = true if defined? yield begin - return yield(*pi) + return yield(*result) ensure pi.each{|p| p.close unless p.closed?} + waiter.join end end - pi + result end module_function :popen3 end |