2010-01-29 78 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