2010-01-29 2 views
8

Ruby에서 외부 프로그램을 호출하는 thread-safe 스크립트를 실행하고 그 외부 프로그램의 종료 상태를 확인하고 싶습니다. 가장 좋은 방법은 무엇입니까? 지금까지 나는 $?을 확인했지만 프로그램의 다른 부분과 경쟁 조건이 있다고 생각합니다. 여기 Ruby의 스레드 안전 외부 프로세스와 exitstatus 검사

몇 가지 예제 코드의 다음 exitstatus은 우연이 아니라 마지막 하나보다, 해당 프로세스에 묶여 있도록 내가

Process.new(`external_program`).exitstatus 

처럼 뭔가를 할 것, 이상적으로

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

그 일이 완료되었습니다. 이 일을 할 수있는 방법이 있습니까?

+0

스크립트는 오픈 소스입니까, 비공개입니까? –

+0

@Andrew : 오픈 소스 (내 스크립트). – Peter

답변

15

rb_last_status (aka $?)는 전역 변수이지만 Ruby는 스레드 당 수 있도록 마술을합니다 : rb_thread_save_context에서 이전 스레드의 구조에 rb_last_status을 저장합니다. rb_thread_restore_context은 저장된 값에서 rb_last_status을 설정합니다. $?과 관련된 경합 상태라면 Ruby 버그입니다.

+1

@Wayne - 이것이 내가 stackoverflow에 오는 이유입니다; 배경 정보를 알고있는 당신 같은 사람들. 감사!! – Peter

+0

@Peter, 여러분 안녕하세요. 당신이 물어볼 때까지 나는 이것을 알지 못했다. 나는 파기를 좋아한다. –