From: Kazuhiro NISHIYAMA Date: 2001-07-06T03:27:00+09:00 Subject: [ruby-dev:13758] Re: Thread.critical=true and fork and exec In <200107021545.f62Fjhu04324@sharui.nakada.kanuma.tochigi.jp> On Tue, 3 Jul 2001 00:46:24 +0900 nobu.nakada@nifty.ne.jp wrote: > io.fcntl(F_SETFD, FD_CLOEXEC) [ruby-dev:13727]に添付していたsafeeval.rbを @child_pid = Process.fork { Thread.critical = true require 'fcntl' [TCPSocket, File].each {|c| ObjectSpace.each_object(c) {|io| begin io.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) rescue SystemCallError,IOError => e STDERR.puts io.inspect, e.inspect if $DEBUG end } } exec([RUBY_EXE, __FILE__], *@arg) } に変更して、 eval('id'+'.id'*1000000) などで一度子プロセスを殺した後、再度接続しようとすると 親プロセスが /usr/lib/ruby/1.6/drb/drb.rb:210:in `open': 接続を拒否されました - "connect(2)" (Errno::ECONNREFUSED) from /usr/lib/ruby/1.6/drb/drb.rb:210:in `send_message' from /usr/lib/ruby/1.6/drb/drb.rb:178:in `method_missing' from ./safeeval.rb:209:in `myfork' from ./safeeval.rb:164:in `push' from ./safeeval.rb:251 で終了して、 子プロセスの方は /usr/lib/ruby/1.6/drb/drb.rb:210:in `open': 接続を拒否されました - "connect(2)" (Errno::ECONNREFUSED) from /usr/lib/ruby/1.6/drb/drb.rb:210:in `send_message' from /usr/lib/ruby/1.6/drb/drb.rb:178:in `method_missing' from ./safeeval.rb:120 で終了してしまいます。 親プロセスの方でも閉じてはいけないものが閉じてしまっているような 感じなのですが。 -- |ZnZ(ゼット エヌ ゼット) |西山和広(Kazuhiro NISHIYAMA)