Потокобезопасный внешний процесс в ruby, плюс проверка exitstatus - PullRequest
9 голосов
/ 29 января 2010

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

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

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

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

Process.new(`external_program`).exitstatus

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

1 Ответ

17 голосов
/ 29 января 2010

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

...