这个问题不是关于
本问题与如何使用File#close或File#open块语法自动关闭文件无关。而是关于Ruby在运行时存储其打开文件描述符列表的位置。
实际问题
如果您有一个具有打开描述符的程序,但没有访问相关的File或IO对象,如何找到对当前打开文件描述符的引用?以此示例为例:
filename='/tmp/foo'
%x( touch "#{filename}" )
File.open(filename)
filehandle = File.open(filename)
第一个文件实例被打开,但对象的引用没有存储在变量中。第二个实例被存储在filehandle中,我可以很容易地使用#inspect或#close访问它。
然而,被丢弃的File对象并没有消失;它只是以任何明显的方式不可访问。在对象被终结之前,Ruby必须在某个地方跟踪它...但是在哪里?
ObjectSpace.each_object(IO) { |f| puts f unless f.closed? }
。请注意,不要更改原文意思,并尽可能保持通俗易懂。 - Liron YahdavObjectSpace.each_object(IO).reject(&:closed?)
在Ruby 3.0.1的irb中,它为我返回了以下内容:[#<IO:<STDERR>>, #<IO:<STDOUT>>, #<IO:<STDIN>>, #<IO:fd 1>, #<IO:fd 0>]。
- Keith Bennett