--- jobs.c +++ jobs.c 2008-01-08 18:10:16.000000000 +0000 @@ -2454,7 +2454,11 @@ wait_for (pid) act.sa_handler = SIG_DFL; sigemptyset (&act.sa_mask); sigemptyset (&oact.sa_mask); +# if defined(MUST_REINSTALL_SIGHANDLERS) act.sa_flags = 0; +# else + act.sa_flags = SA_RESTART; +# endif sigaction (SIGCHLD, &act, &oact); # endif queue_sigchld = 1; --- sig.c +++ sig.c 2011-01-14 13:10:48.591925968 +0000 @@ -668,6 +668,16 @@ set_signal_handler (sig, handler) if we take the time to reap children */ if (sig == SIGCHLD) act.sa_flags |= SA_RESTART; /* XXX */ +#if !defined(MUST_REINSTALL_SIGHANDLERS) + if (sig != SIGALRM && handler != (termsig_sighandler)) + act.sa_flags |= SA_RESTART; /* XXX */ + if (handler == (trap_handler)) + act.sa_flags |= SA_NODEFER; /* XXX */ + if (handler == (termsig_sighandler)) + act.sa_flags |= SA_NODEFER; /* XXX */ + if (sig == SIGTSTP || sig == SIGTTOU || sig == SIGTTIN || sig == SIGCONT) + act.sa_flags |= SA_NODEFER; /* XXX */ +#endif sigemptyset (&act.sa_mask); sigemptyset (&oact.sa_mask);