ash: fix signal5.tests

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2010-05-17 04:42:40 +02:00
parent 9963fe36c2
commit 7c1ed9fbde
2 changed files with 12 additions and 6 deletions

View File

@ -3874,9 +3874,9 @@ dowait(int wait_flags, struct job *job)
} }
static int 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) if (pid <= 0 && pending_sig)
raise_exception(EXSIG); raise_exception(EXSIG);
return pid; return pid;
@ -4069,14 +4069,21 @@ waitcmd(int argc UNUSED_PARAM, char **argv)
jp->waited = 1; jp->waited = 1;
jp = jp->prev_job; jp = jp->prev_job;
} }
blocking_wait_with_raise_on_sig();
/* man bash: /* man bash:
* "When bash is waiting for an asynchronous command via * "When bash is waiting for an asynchronous command via
* the wait builtin, the reception of a signal for which a trap * the wait builtin, the reception of a signal for which a trap
* has been set will cause the wait builtin to return immediately * has been set will cause the wait builtin to return immediately
* with an exit status greater than 128, immediately after which * with an exit status greater than 128, immediately after which
* the trap is executed." * 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); job = getjob(*argv, 0);
/* loop until process terminated or stopped */ /* loop until process terminated or stopped */
while (job->state == JOBRUNNING) while (job->state == JOBRUNNING)
blocking_wait_with_raise_on_sig(NULL); blocking_wait_with_raise_on_sig();
job->waited = 1; job->waited = 1;
retval = getstatus(job); retval = getstatus(job);
repeat: ; repeat: ;

View File

@ -1,4 +1,3 @@
# Not fixed yet
trap "echo USR1 received" USR1 trap "echo USR1 received" USR1
stub() { stub() {
echo "sleeping for $1 sec" echo "sleeping for $1 sec"