ruby中的线程安全外部进程,加上检查exitstatus

ruby中的线程安全外部进程,加上检查exitstatus,ruby,thread-safety,Ruby,Thread Safety,我想在Ruby中运行一段线程安全的脚本,调用一个外部程序,然后检查该外部程序的退出状态。最好的方法是什么?到目前为止,我一直在检查$?,但我认为我得到了程序其他部分的竞争条件 下面是一些示例代码: Thread.new do `external_program` if $?.exitstatus == 0 # it worked. else # it didn't work. end end 理想情况下,我会做类似的事情 Process.new(`externa

我想在Ruby中运行一段线程安全的脚本,调用一个外部程序,然后检查该外部程序的退出状态。最好的方法是什么?到目前为止,我一直在检查
$?
,但我认为我得到了程序其他部分的竞争条件

下面是一些示例代码:

Thread.new do
  `external_program`
  if $?.exitstatus == 0
    # it worked.
  else
    # it didn't work.
  end
end
理想情况下,我会做类似的事情

Process.new(`external_program`).exitstatus

因此,退出状态与这一过程密不可分,而不是碰巧完成的最后一个过程。有什么方法可以做到这一点吗?

虽然rb_last_status(又名
$?
)是一个全局变量,但Ruby为每个线程做了一个魔术:在
rb_thread_save_context
中,它将
rb_last_status
存储在旧线程的结构中<代码>rb_线程\u还原\u上下文根据保存的值设置
rb_上次\u状态
。如果你有一个涉及
$?
的竞态条件,那就是一个Ruby bug。

@Wayne-这就是我来stackoverflow的原因;像你这样知道背景信息的人。谢谢@彼得,不客气。我不知道这一点,直到你问我,并给了我一个理由去挖掘来源。我喜欢挖掘。脚本是开源的还是私有的?@安德鲁:开源的(这是我的脚本)。