首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby在哪里跟踪它的打开文件描述符?

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

Stack Overflow用户
提问于 2012-06-07 04:48:39
回答 1查看 5.6K关注 0票数 25

这个问题不是关于什么

此问题与如何使用File#close或File#open块语法自动关闭文件无关。这是一个关于Ruby在运行时将其打开的文件描述符列表存储在哪里的问题。

实际的问题

如果您有一个具有打开描述符的程序,但您不能访问相关的File或IO对象,那么如何找到对当前打开的文件描述符的引用?举个例子:

代码语言:javascript
复制
filename='/tmp/foo'
%x( touch "#{filename}" )
File.open(filename)
filehandle = File.open(filename)

将打开第一个File实例,但对该对象的引用未存储在变量中。第二个实例存储在文件句柄中,我可以使用#inspect或#close轻松地访问它。

但是,被丢弃的File对象并没有消失;它只是无法以任何明显的方式访问。在对象最终确定之前,Ruby必须跟踪它somewhere...but在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-07 04:48:40

TL;DR

所有文件和IO对象都存储在ObjectSpace中。

回答

ObjectSpace类表示:

ObjectSpace模块包含许多与垃圾收集设施交互的例程,并允许您使用迭代器遍历所有活动对象。

我是如何测试的

我在Ruby 1.9.3p194上的控制台上进行了测试。

测试夹具非常简单。其思想是有两个具有不同对象标识的File对象,但只有一个可以通过变量直接访问。另一个是“外面的某个地方”。

代码语言:javascript
复制
# Don't save a reference to the first object.
filename='/tmp/foo'
File.open(filename)
filehandle = File.open(filename)

然后,我探索了与File对象交互的不同方式,即使我没有使用显式的对象引用。一旦我了解了ObjectSpace,这就出人意料地简单了。

代码语言:javascript
复制
# List all open File objects.
ObjectSpace.each_object(File) do |f|
  puts "%s: %d" % [f.path, f.fileno] unless f.closed?
end

# List the "dangling" File object which we didn't store in a variable.
ObjectSpace.each_object(File) do |f|
  unless f.closed?  
    printf "%s: %d\n", f.path, f.fileno unless f === filehandle
  end
end

# Close any dangling File objects. Ignore already-closed files, and leave
# the "accessible" object stored in *filehandle* alone.
ObjectSpace.each_object(File) {|f| f.close unless f === filehandle rescue nil}

结论

也许还有其他方法可以做到这一点,但这是我想出的答案,以满足我自己的渴望。如果你知道更好的方法,请发布另一个答案。这个世界会变得更好。

票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10922045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档