Tag: 文件描述符

Fork上的Fork,Ruby,ActiveRecord和File Descriptors

我理解当我们分叉一个进程时,子进程inheritance父类打开文件描述符和偏移的副本。 根据手册页,这指的是父母使用的相同文件描述符。 基于该理论在以下程序中 puts “Process #{Process.pid}” file = File.open(‘sample’, ‘w’) forked_pid = fork do sleep(10) puts “Writing to file now…” file.puts(“Hello World. #{Time.now}”) end file.puts(“Welcome to winter of my discontent #{Time.now}”) file.close file = nil 问题1:hibernate10秒的分叉进程不应该丢失其文件描述符,并且在父进程完成并关闭文件并退出时无法写入文件。 问题2:但无论出于何种原因,如果这都有效,那么ActiveRecord在这种情况下如何失去连接。 它只有在我设置时才有效:reconnect => true在ActiveRecord connect上:reconnect => true它是否可以实际连接,这意味着它失去连接。 require “rubygems” require “redis” require ‘active_record’ require ‘mysql2’ connection = ActiveRecord::Base.establish_connection({ :adapter […]

Ruby在哪里跟踪其打开的文件描述符?

这个问题与此无关 这个问题不是关于如何使用File #close或File#open block语法自动关闭文件。 这是一个关于Ruby在运行时存储其打开文件描述符列表的问题。 实际问题 如果您的程序具有开放描述符,但您无权访问相关的文件或IO对象,那么如何找到对当前打开的文件描述符的引用? 举个例子: filename=’/tmp/foo’ %x( touch “#{filename}” ) File.open(filename) filehandle = File.open(filename) 第一个File实例被打开,但对象的引用不存储在变量中。 第二个实例存储在filehandle中,我可以使用#inspect或#close轻松访问它。 但是,丢弃的File对象没有消失; 它只是无法以任何明显的方式访问。 在对象完成之前,Ruby必须在某个地方跟踪它…但在哪里?