我想在Ruby中运行一个线程安全的脚本来调用外部程序,然后检查该外部程序的退出状态。最好的方法是什么?到目前为止,我一直在检查$?
,但我认为我正在与该计划的其他部分达成竞争条件。
以下是一些示例代码:
Thread.new do
`external_program`
if $?.exitstatus == 0
# it worked.
else
# it didn't work.
end
end
理想情况下,我会做类似
的事情Process.new(`external_program`).exitstatus
以便exitstatus
与 进程密不可分,而不是最后一个完成的进程。有没有办法做到这一点?
答案 0 :(得分:17)
虽然rb_last_status(又名$?
)是一个全局变量,但是Ruby为每个线程做了一个神奇的技巧:在rb_thread_save_context
中,它将rb_last_status
存储在旧线程的结构中; rb_thread_restore_context
从保存的值中设置rb_last_status
。如果你有一个涉及$?
的竞争条件,那就是一个Ruby bug。