ash: fix signal5.tests
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
9963fe36c2
commit
7c1ed9fbde
17
shell/ash.c
17
shell/ash.c
@ -3874,9 +3874,9 @@ dowait(int wait_flags, struct job *job)
|
||||
}
|
||||
|
||||
static int
|
||||
blocking_wait_with_raise_on_sig(struct job *job)
|
||||
blocking_wait_with_raise_on_sig(void)
|
||||
{
|
||||
pid_t pid = dowait(DOWAIT_BLOCK, job);
|
||||
pid_t pid = dowait(DOWAIT_BLOCK, NULL);
|
||||
if (pid <= 0 && pending_sig)
|
||||
raise_exception(EXSIG);
|
||||
return pid;
|
||||
@ -4069,14 +4069,21 @@ waitcmd(int argc UNUSED_PARAM, char **argv)
|
||||
jp->waited = 1;
|
||||
jp = jp->prev_job;
|
||||
}
|
||||
blocking_wait_with_raise_on_sig();
|
||||
/* 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."
|
||||
* Do we do it that way? */
|
||||
blocking_wait_with_raise_on_sig(NULL);
|
||||
*
|
||||
* blocking_wait_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_wait_with_raise_on_sig gets pid > 0
|
||||
* and does not handle pending_sig. Check this case: */
|
||||
if (pending_sig)
|
||||
raise_exception(EXSIG);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4096,7 +4103,7 @@ waitcmd(int argc UNUSED_PARAM, char **argv)
|
||||
job = getjob(*argv, 0);
|
||||
/* loop until process terminated or stopped */
|
||||
while (job->state == JOBRUNNING)
|
||||
blocking_wait_with_raise_on_sig(NULL);
|
||||
blocking_wait_with_raise_on_sig();
|
||||
job->waited = 1;
|
||||
retval = getstatus(job);
|
||||
repeat: ;
|
||||
|
@ -1,4 +1,3 @@
|
||||
# Not fixed yet
|
||||
trap "echo USR1 received" USR1
|
||||
stub() {
|
||||
echo "sleeping for $1 sec"
|
||||
|
Loading…
Reference in New Issue
Block a user