From: SATOH Fumiyasu Date: 2008-03-20T15:47:56+09:00 Subject: [ruby-dev:34094] tempfile.unlink 後に tempfile.close さとうふみやす @ OSS テクノロジです。 Tempfile オブジェクトを unlink した後に close すると、 以下のように例外が発生してしまいます。 $ ruby -v ruby 1.8.6 (2008-03-03 patchlevel 114) [x86_64-linux] ちなみに Ruby 1.9.0-1 では発生しませんでした。 $ cat ~/test.rb require 'tempfile' temp = Tempfile.new('test') temp.unlink temp.close $ ruby test.rb /usr/lib/ruby/1.8/tempfile.rb:84:in `_close': undefined method `[]=' for nil:NilClass (NoMethodError) from /usr/lib/ruby/1.8/tempfile.rb:97:in `close' from /home/fumiyas/test.rb:5 実際に問題となったのは、以下のようなコードです: input_tmp = Tempfile.new('chimera-filter') input_tmp.unlink super(input, input_tmp) input_tmp.rewind stdout_reader, stdout_writer = IO.pipe stderr_reader, stderr_writer = IO.pipe pid = Process.fork do begin $stdin.reopen(input_tmp) input_tmp.close ← ここで落ちる $stdout.reopen(stdout_writer) stdout_writer.close stdout_reader.close $stderr.reopen(stderr_writer) stderr_writer.close stderr_reader.close ENV['PATH'] = @path if (@path) Kernel.exec([@command, @arg0], *@args) rescue Exception => e $stderr.puts("#{$0}: ERROR: #{__FILE__}: exec failed: #{@command}: #{e}") exit!(1) end end -- -- Name: SATOH Fumiyasu (fumiyas @ osstech co jp) -- Business Home: http://www.OSSTech.co.jp/ -- Personal Home: http://www.SFO.jp/blog/