在Ruby中创建临时文件?

时间:2014-03-31 15:56:33

标签: ruby linux

我正在使用Ruby 1.8.7(2010-12-23 patchlevel 330)[x86_64-linux]。

当尝试使用tempfile gem创建临时文件时,它会卡住,我无法退出:

1.8.7 :003 > require 'rubygems'
1.8.7 :004 >  require 'tempfile'
1.8.7 :005 > tmp_file = Tempfile.new("new_file")

在最后一行之后,它被卡住而没有响应。

我认为它适用于较新的Ruby版本,但是有谁知道什么会导致这个问题?

1 个答案:

答案 0 :(得分:0)

它'没有更深入的调试就不容易找到问题。尝试运行:

class Tempfile
  def initialize(basename, tmpdir=Dir::tmpdir)
    if $SAFE > 0 and tmpdir.tainted?
      tmpdir = '/tmp'
    end

    lock = nil
    n = failure = 0

    begin
      puts 'Entering critcal stage'
      Thread.critical = true
      begin
        tmpname = File.join(tmpdir, make_tmpname(basename, n))
        lock = tmpname + '.lock'
        n += 1
        puts n 
      end while @@cleanlist.include?(tmpname) or
        File.exist?(lock) or File.exist?(tmpname)

      Dir.mkdir(lock)
    #rescue
    #  failure += 1
    #  retry if failure < MAX_TRY
    #  raise "cannot generate tempfile `%s'" % tmpname
    ensure
      Thread.critical = false
      puts 'critical stage left'
    end

    @data = [tmpname]
    @clean_proc = Tempfile.callback(@data)
    ObjectSpace.define_finalizer(self, @clean_proc)

    @tmpfile = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600)
    @tmpname = tmpname
    @@cleanlist << @tmpname
    @data[1] = @tmpfile
    @data[2] = @@cleanlist

    super(@tmpfile)

    Dir.rmdir(lock)
  end
end

这应该与您的Tempfile initialize方法相同,并带有一些调试位。你可以运行它,然后重试创建一个新的临时文件。当您使用控制台输出发表评论时,我会更新答案。