2010-01-29 1 views
8

Я хочу запустить потокобезопасный скрипт в Ruby, который вызывает внешнюю программу, а затем проверяет статус выхода этой внешней программы. Каков наилучший способ сделать это? До сих пор я проверял $?, но я думаю, что я получаю условия гонки с другими частями программы.Потоковый внешний процесс в рубине плюс проверка exitstatus

Вот пример кода:

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

В идеале я хотел бы сделать что-то вроде

Process.new(`external_program`).exitstatus 

так что exitstatus был неразрывно связан с этого процесса, а не последним, что завершилось. Есть какой-либо способ сделать это?

+0

Является ли сценарий открытым исходным кодом или частным? –

+0

@ Андрю: с открытым исходным кодом (это мой сценарий). – Peter

ответ

15

Хотя rb_last_status (ака $?) является глобальной переменной, Ruby делает магический трюк, чтобы сделать это за нить: В rb_thread_save_context, он хранит в структуре старого потока rb_last_status; rb_thread_restore_context устанавливает rb_last_status из сохраненного значения. Если у вас есть состояние гонки с $?, это ошибка Ruby.

+1

@Wayne - вот почему я прихожу к stackoverflow; таких, как вы, кто знает информацию о предыстории. Благодаря!! – Peter

+0

@ Питер, пожалуйста. Я не знал этого до тех пор, пока вы не попросили меня и не дали мне повода для того, чтобы врываться в источник. Мне нравится рыть. –

 Смежные вопросы

  • Нет связанных вопросов^_^