【问题标题】:What's the meaning of `0x0100` for a `Process::Status` value?`Process::Status` 值的`0x0100` 是什么意思?
【发布时间】:2016-03-05 14:18:47
【问题描述】:

我有代码:

Process.spawn(RbConfig.ruby, "a ruby file", "arg")

我等待并通过以下方式检查其状态:

Process.wait
$?.success?

大多数时候,它运作良好。但有时,$?.success?false$?.to_i0x0100。在返回0x0100 之前,失败的进程似乎没有机会运行任何代码(我没有向进程发送任何信号)。我想知道0x0100 的含义。我还想知道当命令没问题时 Ruby 的 spawn 是否会失败。有人可以帮忙吗?

【问题讨论】:

  • 我不知道这个上下文的具体含义,但是那个数据结构(0x0000)是一个十六进制掩码。每个数字是一个从 0 到 15 的数字(其中 10 到 15 由字母 A 到 F 表示)。 0x0100 是数字 256。
  • $?.inspect 告诉你什么?另外,$?.to_s
  • 正常运行代码会执行吗?或者通过使用 ruby​​ 在命令行上运行它?
  • 我以同样的方式运行代码。大多数时候它运作良好。但偶尔会失败。我强烈怀疑它与内存不足有关,因此 Ruby 无法生成进程,并且 Ruby 或 Linux 在 spawn 返回时不会立即返回失败,并且在您等待并检查代码后返回此类失败(即 Ruby 中的 Process::Status)。
  • Ruby 文档说这些值取决于平台 - 一些细节在这里:stackoverflow.com/questions/1101957/… - 不一定是您问题的答案

标签: ruby process standard-library


【解决方案1】:

这是来自 Process::Status 类文档的引用:

Posix 系统使用 16 位整数记录有关进程的信息。低位记录进程状态(已停止、已退出、已发出信号),高位可能包含附加信息(例如,在已退出进程的情况下程序的返回码)。在 Ruby 1.8 之前,这些位直接暴露给 Ruby 程序。 Ruby 现在将这些封装在 Process::Status 对象中。然而,为了最大限度地提高兼容性,这些对象保留了面向位的接口。在下面的描述中,当我们谈到 stat 的整数值时,我们指的是这个 16 位的值。

Process::Status#to_i 方法将此统计信息作为 Fixnum 返回。

【讨论】:

  • 我阅读了该文档。但是,我想知道具体代码0x0100的含义:是不是表示某个系统错误,说内存不足?顺便说一句,我在 Ubuntu 14.04 上运行了代码。
  • 嘿。所以看起来状态是在这个方法中设置的。不幸的是,我对 C 几乎一无所知,所以我不确定我是否能够走得更远。 rxr.whitequark.org/mri/source/process.c#705
  • 如果我阅读正确,首先将 pid 和 wait_data 结构(包含 pid)转换为 st_data_t。我无法找到这种转换是如何完成的,但 st_data_t 是整个代码库中使用的核心 ruby​​ 类型,它在此处定义:rxr.whitequark.org/mri/source/include/ruby/st.h#020
【解决方案2】:

好的,我终于得到了答案:当一个 ruby​​ 进程抛出一个未捕获的异常时,该进程的退出代码将是 0x0100。这是我对 Ubuntu 14.04 和 Ruby 2.2 的观察。例如:有一个ruby文件a.rb,在另一个文件src.rb中,有一个代码sn-p:

Process.spawn(RbConfig.ruby, "a.rb", "arg")
Process.wait

如果 a.rb 抛出未捕获的异常,则 $?.to_i 将为 0x0100。更重要的是,我还观察到 a.rb 有时在其进程以 0x0100 失败之前没有被执行。所以我想这可能与 Ruby 解释器有关,因为我确定 a.rb 没问题。

无论如何,没有官方文件提到确切的行为。所以我的经验供大家参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多