[#30220] schedule for Ruby 1.8.6 — "Akinori MUSHA" <knu@...>

 ruby-core を読んでいない人もいると思うので、ここでもアナウンス

20 messages 2007/01/30

[ruby-dev:30197] Re: Open3.popen3 の終了処理

From: "Nobuyoshi Nakada" <nobu@...>
Date: 2007-01-26 03:01:45 UTC
List: ruby-dev #30197
なかだです。

At Fri, 26 Jan 2007 09:26:39 +0900,
Nobuyoshi Nakada wrote in [ruby-dev:30195]:
> > これだと、at_exit よりも前に実行される trap SIGEXIT が動いちゃいます。
>
> なるほど。であれば at_exit を trap SIGEXIT にすればどうでしょう。

at_exit をかえるんじゃなくて、trapをデフォルトに戻しておけばよさそうです。
それと、Process.detachが追加されてるので二重forkはもう不要かも。


Index: lib/open3.rb
===================================================================
--- lib/open3.rb	(revision 11551)
+++ lib/open3.rb	(working copy)
@@ -51,6 +51,4 @@ module Open3
     pid = fork{
       # child
-      fork{
-	# grandchild
 	pw[1].close
 	STDIN.reopen(pw[0])
@@ -65,13 +63,14 @@ module Open3
 	pe[1].close

+      trap("EXIT", "DEFAULT")
+      at_exit {exit!(false)}
+      at_exit {raise($!)}
 	exec(*cmd)
       }
-      exit!(0)
-    }

     pw[0].close
     pr[1].close
     pe[1].close
-    Process.waitpid(pid)
+    Process.detach(pid)
     pi = [pw[1], pr[0], pe[0]]
     pw[1].sync = true


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next