diff options
-rw-r--r-- | shell/ash.c | 25 |
1 files changed, 7 insertions, 18 deletions
diff --git a/shell/ash.c b/shell/ash.c index 3a364dc..e21df32 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -4032,15 +4032,6 @@ dowait(int block, struct job *job) return pid; } -static int -blocking_dowait_with_raise_on_sig(void) -{ - pid_t pid = dowait(DOWAIT_BLOCK, NULL); - if (pid <= 0 && pending_sig) - raise_exception(EXSIG); - return pid; -} - #if JOBS static void showjob(struct job *jp, int mode) @@ -4229,19 +4220,14 @@ waitcmd(int argc UNUSED_PARAM, char **argv) jp->waited = 1; jp = jp->prev_job; } - blocking_dowait_with_raise_on_sig(); + dowait(DOWAIT_BLOCK, NULL); /* man bash: * "When bash is waiting for an asynchronous command via * the wait builtin, the reception of a signal for which a trap * has been set will cause the wait builtin to return immediately * with an exit status greater than 128, immediately after which * the trap is executed." - * - * blocking_dowait_with_raise_on_sig raises signal handlers - * if it gets no pid (pid < 0). However, - * if child sends us a signal *and immediately exits*, - * blocking_dowait_with_raise_on_sig gets pid > 0 - * and does not handle pending_sig. Check this case: */ + */ if (pending_sig) raise_exception(EXSIG); } @@ -4263,8 +4249,11 @@ waitcmd(int argc UNUSED_PARAM, char **argv) job = getjob(*argv, 0); } /* loop until process terminated or stopped */ - while (job->state == JOBRUNNING) - blocking_dowait_with_raise_on_sig(); + while (job->state == JOBRUNNING) { + pid_t pid = dowait(DOWAIT_BLOCK, NULL); + if (pid <= 0 && pending_sig) + raise_exception(EXSIG); + } job->waited = 1; retval = getstatus(job); repeat: ; |