2010-01-29 9 views
8

ich ein Thread-sichere Stück Skript in Ruby ausgeführt werden soll, die ein externes Programm aufruft, überprüft dann den Exit-Status des externen Programms. Was ist der beste Weg, es zu tun? Bisher habe ich $? wurde überprüft, aber ich denke, ich bin immer eine Race Condition mit anderen Teilen des Programms.Gewinde sicher externer Prozess in Rubin, sowie die Überprüfung exitstatus

Hier einige Beispiel-Code:

Thread.new do 
    `external_program` 
    if $?.exitstatus == 0 
    # it worked. 
    else 
    # it didn't work. 
    end 
end 

etwas Idealer wie

, ich tun würde
Process.new(`external_program`).exitstatus 

, so dass die exitstatus untrennbar mit dass Prozess gebunden war, eher als die letzte, die geschah zum Abschluss. Gibt es eine Möglichkeit, dies zu tun?

+0

Ist das Skript Open-Source oder privat? –

+0

@Andrew: Open Source (es ist mein Skript). – Peter

Antwort

15

Obwohl rb_last_status (aka $?) eine globale Variable ist, hat Ruby einen magischen Trick es pro Thread zu machen: In rb_thread_save_context, speichert er rb_last_status in der alten Thread-Struktur; rb_thread_restore_context Sätze rb_last_status aus dem gespeicherten Wert. Wenn Sie eine Race-Bedingung beteiligt $? haben, ist es ein Ruby-Bug.

+1

@Wayne - das ist, warum ich zu kommen Stackoverflow; Leute wie du, die die Hintergrundinformationen kennen. Vielen Dank!! – Peter

+0

@Peter, gern geschehen. Ich wusste das nicht, bis du gefragt hast und gab mir einen Grund, in die Quelle zu graben. Ich mag graben. –