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

2024-03-05

这个问题是什么Not About

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

实际问题

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

filename='/tmp/foo'
%x( touch "#{filename}" )
File.open(filename)
filehandle = File.open(filename)

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

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


TL; DR

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

Answer

The 对象空间 http://www.ruby-doc.org/core-1.9.3/ObjectSpace.html类 说:

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

我是如何测试的

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

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

# Don't save a reference to the first object.
filename='/tmp/foo'
File.open(filename)
filehandle = File.open(filename)

然后,即使我没有使用显式对象引用,我也探索了与 File 对象交互的不同方式。当我了解了 ObjectSpace 后,这变得非常简单。

# 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}

结论

可能还有其他方法可以做到这一点,但这是我为了解决自己的问题而想出的答案。如果您知道更好的方法,请发布另一个答案。世界将因它而变得更加美好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Rails 中的 PDF 导出

    我需要将包含一些图表的 HTML 页面导出为 PDF 有哪些好的 gem 可以做到这一点 PDFKit http railscasts com episodes 220 pdfkit http railscasts com episodes
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L
  • 捆绑安装无法从 https://rubygems.org/ 获取规格

    我正在尝试遵循 Hartl Rails 教程 但在使用捆绑器 gem 时遇到了问题 使用命令 bundle install 或 bundle update 时 我得到以下输出 从中获取源索引https rubygems org https
  • 读取混合(即文本和二进制)数据的最佳方法是什么?

    我需要能够读取混合二进制和非二进制数据的文件格式 假设我知道输入是好的 那么最好的方法是什么 作为示例 我们以一个文件为例 该文件的第一行是 double 换行符 0x0D 0x0A 后面是十个字节的二进制数据 当然 我可以计算换行符的位置
  • 对 os.listdir 文件进行排序 Python

    如果已下载数年的数据 这些数据存储在具有以下命名约定的文件中 year day dat 例如 名为 2014 1 dat 的文件包含 2014 年 1 月 1 日的数据 我需要按天排序读取这些数据文件 2014 1 dat 2014 2 d
  • 预期的 ProductField,出现数组问题

    我有一个 Rails 4 应用程序 它有一个如下所示的 params 块 def store params params require store permit name description user id products attr
  • 在私有控制器方法中返回redirect_to

    前言 我正在使用设备进行身份验证 我试图阻止未经授权的用户查看 编辑或更新其他用户的信息 我最关心的是用户将 DOM 中的表单修改为另一个用户的 ID 填写表单 然后单击更新 我已经专门阅读过 像下面这样的东西应该有效 但事实并非如此 SO
  • Rails:CSRF 令牌不工作但已设置

    我在 Heroku 上有我的 Rails 3 应用程序 当我发送银行信息时 我得到 WARNING Can t verify CSRF token authenticity但我的 CSRF 令牌已设置 https gist github c
  • 通过推送通知唤醒

    Suppose 有一些对象 例如 一个数组a 和依赖于对象的条件 例如 a empty 当前线程以外的某些线程可以操作该对象 a 因此条件评估值的真实性会随着时间的推移而变化 如何让当前线程在代码中的某个时刻休眠 并在条件满足时通过推送通知
  • Rails 3 在 Ruby 1.9.2 上初始化非常慢

    我使用 RVM 来管理环境 安装了 Ruby 1 9 2 p136 我认为是最新版本 和 Rails 3 创建了 gemset 并运行捆绑器 到目前为止一切正常 但 Rails 在运行命令 即生成 销毁 rake 等 时初始化速度非常慢 完
  • 多重要求和允许强参数rails 4

    在下面的情况下 我尝试使用强参数 我想要求email address password并允许remember me fields 但像下面这样使用它只允许最后一行在方法示例中 在下面的情况下 它只需要params permit rememb
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • 如何从 ruby​​ 中的字符串中删除所有非数字?

    用户输入数字的形式如下 1 800 432 4567 800 432 4567 800 432 4566 800 432 4567 1 800 432 4567 800 432 4567 我希望所有这些都变成没有特殊字符的剥离版本 例如18
  • 我在 Rails 中使用了保留字吗?

    这是我的模型 class Record lt ActiveRecord Base belongs to user belongs to directory end class Directory lt ActiveRecord Base h
  • Bundle 说 gem 丢失了 - 但事实并非如此?

    背景 我正在维护contentRuby On Rails 站点 但我确实没有 Rails 的经验 当尝试运行 Rails 服务器时 rails s我明白了 在任何来源中均找不到 activesupport 3 2 0 Run bundle
  • 在 Ruby 中创建一个空文件:相当于“touch”?

    创建一个的最佳方式是什么emptyRuby 中的文件 类似于 Unix 命令的东西 touch https en wikipedia org wiki Touch 28Unix 29 touch file txt FileUtils tou
  • ruby 正则表达式匹配模式的多次出现

    我正在寻找构建一个 ruby 正则表达式来匹配模式的多次出现并将它们返回到数组中 模式很简单 即 两个左括号 一个或多个字符 后跟两个右括号 这就是我所做的 str Some random text lead first name and
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • Ruby 是否有一个 Expect 等效 gem?

    Ruby 是否有一个 Expect 等效 gem 我尝试在 code google 和 ruby gems org 上搜索 但遗憾的是它没有出现 FYI Expect http en wikipedia org wiki Expect是一个
  • 什么是适合 Rails 3 的测试框架?

    去年我一直在使用 Ruby On Rails 但是 无法进行单元测试 现在我必须编写单元测试代码 哪个测试框架好 为什么 有这方面的好的教程吗 我的系统配置 Ruby 1 9 2 Rails 3 Ubuntu 10 第一个技巧是 尝试升级到

随机推荐

  • 在R6RS方案中,有没有办法获取当前环境以供eval使用?

    R6RS方案中有没有办法获取当前环境 然后将其作为第二个参数传递给eval 例如 下面的表达式要返回 9 问号应该是什么 let x 4 y 5 eval x y 不 R6RS中没有这样的东西 一些罕见的实现可能支持类似的东西 但绝大多数
  • 如何在 R 中高效地生成向量?

    假设您有一个函数 它接受一个数字作为输入并输出一个向量 但是 输出向量的大小取决于输入 并且您无法在函数之前计算它 例如 采取3N 1著名算法 https en wikipedia org wiki Collatz conjecture 该
  • 如何使用 Spray-json 将 JsArray 转换为案例类序列?

    我有一个变量 var movieArray movieText parseJson 属于哪一类 println movieArray getClass class spray json JsArray 如何将其转换为案例类序列 例如 cas
  • 如何强制 Azure 存储帐户为经典帐户

    我们最近使用 Azure 资源管理器和模板构建了基础设施和应用程序部署框架 为了部署云服务 需要首先设置一个Azure存储帐户 截至最近 这是通过运行来完成的 Switch AzureMode AzureResourceManager Ne
  • 基于视图的 NSOutlineView 中 NSTextField 的委托事件?

    我有一个基于视图的完美功能NSOutlineView在我的项目中使用正确的设置数据源 现在我想允许用户更改某些条目 所以我做了NSTextField在IB中可编辑 对于基于细胞的NSOutlineView你可以使用委托方法outlineVi
  • 如何覆盖 Visual Studio 的菜单加速器快捷方式?

    我是一名基于 Mac 的 Net 开发人员 因此多年来我养成了将某些常用功能重新映射到一组更 Macish 的键盘快捷键的习惯 CUT Ctrl X gt Alt X COPY Ctrl C gt Alt C PASTE Ctrl V gt
  • Android Room SQLite_ERROR 没有这样的表

    我正在尝试使用安卓房间 https developer android com topic libraries architecture room html并在跟随之后本教程 http www vogella com tutorials A
  • 在 persistence.xml 之外定义 jpa 实体类

    有没有办法在 persistence xml 之外定义 jpa 实体类 即在单独的文件中 能够不将 persistence xml 作为外部文件也足够了 提前致谢 史蒂文 编辑 抱歉我没说清楚 这是在 Java SE 环境中 另外 我不想在
  • 调用 AutoFixture 自定义的 Dispose 方法

    我正在使用 AutoFixture 自定义来测试访问 SQL Compact DB 的存储库 测试完成后立即删除该数据库对我非常有帮助 因为数据库是在自定义构造函数中创建的 所以我认为删除它的最佳位置是在 dispose 方法中 我正在想的
  • 如何执行“nslookup主机服务器”

    My C 服务需要定期轮询nslookup host server 目前它产生了一个Process执行批处理脚本 由于性能原因 我正在考虑使用一些进行此检查API 但问题是 例如 使用System Net Dns GetHostAddres
  • g++ __static_initialization_and_destruction_0(int, int) - 它是什么

    编译 c 文件 带有全局静态对象 后 我进入nm输出这个函数 00000000 t Z41 static initialization and destruction 0ii static initialization and destru
  • 如何在 Play! 中将复选框绑定到布尔值!框架

    我正在使用 Play 开发一个应用程序 框架有一个名为gift 的对象 它具有一个名为Taken 的布尔属性 如何在我的视图中将该值的状态显示为复选框 我试过了
  • PyQt - QTableView 不响应 dataChanged 信号?

    QSqlQueryModel是一个很棒的数据库模型 但它是只读的 所以我重写了它setData and flags 方法 现在 我可以编辑我的数据库表QTableView 但是当我发出一个 QTableView 时 它不会刷新自己dataC
  • 在java中为以下数据选择完美的数据结构

    我必须根据我的需要选择一种数据结构 下面我解释一下有以下值的条件 abc def rty ytr dft which all are map to row R1B1 actully key is combination of R1 B1 a
  • 我该如何优化 IE7/IE8 的 ajax 应用程序以避免“停止运行此脚本”?

    我的预订引擎在 IE7 中运行非常缓慢 它是 ajaxified 和基于 hash window onchange 的 总共有 5 个步骤 我遇到的主要问题是第 2 步在 IE 中速度非常慢 当用户到达第 2 步时 系统会发出 ajax 请
  • 用作默认参数的 C#“常量对象”

    有没有办法创建一个常量对象 即它不能编辑并且在编译时创建 我只是在玩 C 语言 注意到可选参数功能 并认为能够使用默认对象作为可选参数可能会很不错 考虑以下 this class has default settings private c
  • 无状态 Apache Wicket 无状态页面/请求

    所以我在读另一个问题 https stackoverflow com questions 2168249在 Wicket 标签下进行比较阿帕奇检票口 http wicket apache org and 阿帕奇点击 http incubat
  • 将电子表格数据显示为 HTML 表格

    我的 HTML 表有问题 我希望我的电子表格数据显示在那里 我不知道我错过了什么 这是我的代码 GS function getTableData var url3 https docs google com spreadsheets d x
  • Vue 3:getCurrentInstance() 是否已弃用?

    我看过参考文献getCurrentInstance 可以在一些旧的 文档和代码上使用 但在当前的 Vue 3 文档中找不到它 Is getCurrentInstance 已弃用 如果有 原因是什么 inject 考虑够了吗 如果没有 为什么
  • Ruby 在哪里跟踪其打开的文件描述符?

    这个问题是什么Not About 这个问题是not关于如何使用 File close 或 File open 块语法自动关闭文件 这是一个关于 Ruby 在运行时将打开的文件描述符列表存储在哪里的问题 实际问题 如果您有一个具有打开描述符的