From: Eric Wong Date: 2015-07-08T02:55:18+00:00 Subject: [ruby-core:69897] Re: [Ruby trunk - Bug #11336] TestProcess#test_exec_fd_3_redirect failed on Solaris 10 ngotogenome@gmail.com wrote: > ~~~ > $ ruby -e 'a = IO.pipe; b = IO.pipe; p a; p b; pid = fork { exec("ruby", "-e", "print IO.for_fd(3).read(1)", 3=>a[0],1=>b[1]) }; b[1].close; a[0].close; a[1].write("."); p b[0].read(1); Process.wait(pid)' > [#, #] > [#, #] > [ASYNC BUG] consume_communication_pipe: read OK, I also hit the problem on a VM, too. The problem is the timer thread is still running when we are performing redirects for exec. Can you try the following to stop the timer thread? ~~~ --- a/process.c +++ b/process.c @@ -2566,7 +2566,7 @@ rb_f_exec(int argc, const VALUE *argv) #if defined(__APPLE__) || defined(__HAIKU__) rb_exec_without_timer_thread(eargp, errmsg, sizeof(errmsg)); #else - before_exec_async_signal_safe(); /* async-signal-safe */ + before_exec(); /* NOT async-signal-safe */ rb_exec_async_signal_safe(eargp, errmsg, sizeof(errmsg)); preserving_errno(after_exec_async_signal_safe()); /* async-signal-safe */ #endif ~~~ I will have limited Internet access the next few days. Feel free to commit if it works for you; maybe the timer thread needs to be restarted if execve fails, too (but the process will die). Also, maybe the __APPLE__ || __HAIKU__ code above is suitable for all OS, too. In the coming weeks, we may also consider lazy spawning timer thread, single-threaded scripts do not need it.