Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中创建临时文件?_Ruby_Linux - Fatal编程技术网

在Ruby中创建临时文件?

在Ruby中创建临时文件?,ruby,linux,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") 在最后一行之后,它卡住了,没有响应 我认为它适用于较新的Rub

我使用的是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版本,但是有人知道是什么导致了这个问题吗

不进行深入的调试就很难找到问题。尝试运行:

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
类临时文件
def初始化(basename,tmpdir=Dir::tmpdir)
如果$SAFE>0且tmpdir.trainted?
tmpdir='/tmp'
结束
锁定=零
n=故障=0
开始
将“进入关键阶段”
Thread.critical=true
开始
tmpname=File.join(tmpdir,maketmpname(basename,n))
lock=tmpname+'.lock'
n+=1
放n
在@@cleanlist时结束。包括?(tmpname)或
File.exist?(锁定)或File.exist?(tmpname)
目录mkdir(锁)
#拯救
#故障+=1
#如果失败,请重试@@清除列出
$SAFE
Dir::tmpdir
?$SAFE=0和Dir::tmpdir r=“/tmp”Try:
Tempfile.new('new_file',file.expand_path('.'))
。没有帮助。。还是同样的问题好吧,接下来的一组问题是:
Tempfile::MAX_TRY
,你得到了什么?另外,如果运行
File.exist?('/tmp/anywhere')
(简单的检查,但值得一试),会发生什么情况。同时尝试设置
Tempfile::MAX_try=0
,看看是否有任何变化。我用strace运行了它,它一直告诉我:stat(“/tmp/thistmpfile.lock”,0x7fff20e80070)=-1 enoint(没有这样的文件或目录)stat(“/tmp/thistmpfile”,{st_mode=S|IFREG | 0600,st_size=0,…) = 0@gal-加载上述代码后是否运行了它
Tempfile.new
它最多会抛出一个错误。@gal-这不是我自己写的代码,这是Ruby 1.8.7补丁330的Tempfile
initialize
方法的实现,我相信这是您的ruby版本?在您的命令行类型
gem中,哪个tempfile
-它将为您提供一个指向“tempfile.rb”文件的路径。我发现有人手动编辑了该文件并放入:tmpname='/tmp/thistempfile',它导致了无休止的循环:(