Thread-safe external process in ruby, plus checking exitstatus

ruby, thread-safety

Solution

Although rb_last_status (aka `$?`) is a global variable, Ruby does a magic trick to make it per-thread: In `rb_thread_save_context`, it stores `rb_last_status` in the old thread's structure; `rb_thread_restore_context` sets `rb_last_status` from the saved value. If you've got a race condition involving `$?`, it's a Ruby bug.

Problem

I want to run a thread-safe piece of script in Ruby that calls an external program, then checks the exit status of that external program. What's the best way to do it? So far, I've been checking `$?`, but I think I'm getting a race condition with other parts of the program. Here's some example code: ``` Thread.new do `external_program` if $?.exitstatus == 0 # it worked. else # it didn't work. end end ``` Ideally, I'd do something like ``` Process.new(`external_program`).exitstatus ``` so that the `exitstatus` was inextricably bound to that process, rather than the last one that happened to complete. Is there any way to do this?

Original source