summaryrefslogtreecommitdiff
path: root/Src/jobs.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/jobs.c')
-rw-r--r--Src/jobs.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/Src/jobs.c b/Src/jobs.c
index 77dbf51c9..9dbdc8185 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -1141,6 +1141,7 @@ waitforpid(pid_t pid, int wait_cmd)
/* child_block() around this loop in case #ifndef WNOHANG */
dont_queue_signals();
child_block(); /* unblocked in signal_suspend() */
+ queue_traps(wait_cmd);
while (!errflag && (kill(pid, 0) >= 0 || errno != ESRCH)) {
if (first)
first = 0;
@@ -1148,7 +1149,7 @@ waitforpid(pid_t pid, int wait_cmd)
kill(pid, SIGCONT);
last_signal = -1;
- signal_suspend(SIGCHLD, wait_cmd);
+ signal_suspend(SIGCHLD);
if (last_signal != SIGCHLD && wait_cmd) {
/* wait command interrupted, but no error: return */
restore_queue_signals(q);
@@ -1156,6 +1157,7 @@ waitforpid(pid_t pid, int wait_cmd)
}
child_block();
}
+ unqueue_traps();
child_unblock();
restore_queue_signals(q);
@@ -1177,6 +1179,7 @@ zwaitjob(int job, int wait_cmd)
dont_queue_signals();
child_block(); /* unblocked during signal_suspend() */
+ queue_traps(wait_cmd);
if (jn->procs || jn->auxprocs) { /* if any forks were done */
jn->stat |= STAT_LOCKED;
if (jn->stat & STAT_CHANGED)
@@ -1184,7 +1187,7 @@ zwaitjob(int job, int wait_cmd)
while (!errflag && jn->stat &&
!(jn->stat & STAT_DONE) &&
!(interact && (jn->stat & STAT_STOPPED))) {
- signal_suspend(SIGCHLD, wait_cmd);
+ signal_suspend(SIGCHLD);
if (last_signal != SIGCHLD && wait_cmd)
{
/* builtin wait interrupted by trapped signal */
@@ -1211,6 +1214,7 @@ zwaitjob(int job, int wait_cmd)
pipestats[0] = lastval;
numpipestats = 1;
}
+ unqueue_traps();
child_unblock();
restore_queue_signals(q);