さとうふみやす @ 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/