2010-01-29 38 views
8

我想在Ruby中运行一个线程安全的脚本,调用一个外部程序,然后检查该外部程序的退出状态。什么是最好的方式来做到这一点?到目前为止,我一直在检查$?,但我认为我正在与该计划的其他部分竞争。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

脚本是开源还是私有? – 2010-01-31 22:12:23

+0

@Andrew:开源(这是我的脚本)。 – Peter 2010-02-01 03:13:25

回答

15

虽然rb_last_status(又名$?)是一个全局变量,但Ruby做了一个魔术来使它成为每个线程:在rb_thread_save_context中,它将rb_last_status存储在旧线程的结构中; rb_thread_restore_context从保存的值中设置rb_last_status。如果您遇到涉及$?的竞争状况,那是一个Ruby错误。

+1

@Wayne - 这就是为什么我来到stackoverflow;喜欢你的人知道背景信息。谢谢!! – Peter 2010-01-29 21:32:32

+0

@彼得,不客气。直到你问及给我一个挖掘源头的理由之前,我才知道这一点。我喜欢挖。 – 2010-01-29 21:37:24