diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | process.c | 3 | ||||
-rw-r--r-- | test/ruby/test_process.rb | 9 |
3 files changed, 16 insertions, 1 deletions
@@ -1,3 +1,8 @@ +Sun Jun 10 11:44:57 2012 Tanaka Akira <akr@fsij.org> + + * process.c (rb_fork_internal): call after_fork only unless + chfunc_is_async_signal_safe. + Sun Jun 10 11:33:01 2012 Martin Bosslet <Martin.Bosslet@googlemail.com> * ext/openssl/ossl_pkey_ec.c @@ -2945,7 +2945,8 @@ rb_fork_internal(int *status, int (*chfunc)(void*, char *, size_t), void *charg, _exit(127); #endif } - after_fork(); + if (!chfunc_is_async_signal_safe) + after_fork(); close(ep[1]); error_occured = recv_child_error(ep[0], &state, &exc, &err, errmsg, errmsg_buflen, chfunc_is_async_signal_safe); if (state || error_occured) { diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index 4ff4023b51..b3ecc420ed 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -1424,4 +1424,13 @@ class TestProcess < Test::Unit::TestCase assert_nothing_raised { spawn(*TRUECOMMAND, :new_pgroup=>true) } assert_nothing_raised { IO.popen([*TRUECOMMAND, :new_pgroup=>true]) {} } end + + def test_sigpipe + system(RUBY, "-e", "") + with_pipe {|r, w| + r.close + assert_raise(Errno::EPIPE) { w.print "a" } + } + end + end |