On Sun, May 06, 2018 at 12:02:43AM +0800, Herbert Xu wrote:
> Subject: jobs - Do not block when waiting on SIGCHLD
> Because of the nature of SIGCHLD, the process may have already been
> waited on and therefore we must be prepared for the case that wait
> may block. So ensure that it doesn't by using WNOHANG.
> Fixes: 03876c0743a5 ("eval: Reap zombies after built-in...")
> Signed-off-by: Herbert Xu <[email protected]>
> diff --git a/src/jobs.c b/src/jobs.c
> index 1a97c54..6dc555f 100644
> --- a/src/jobs.c
> +++ b/src/jobs.c
> @@ -975,8 +975,8 @@ waitforjob(struct job *jp)
> int st;
>
> TRACE(("waitforjob(%%%d) called\n", jp ? jobno(jp) : 0));
> - while ((jp && jp->state == JOBRUNNING) || gotsigchld)
> - dowait(DOWAIT_BLOCK, jp);
> + while (jp ? jp->state == JOBRUNNING : gotsigchld)
> + dowait(jp ? DOWAIT_BLOCK : DOWAIT_NORMAL, jp);
> if (!jp)
> return exitstatus;
> st = getstatus(jp);
Now each of the first four executable lines of waitforjob() does
something different for jp == NULL and jp != NULL. It probably makes
more sense to separate the jp == NULL case into a new function.
--
Jilles Tjoelker
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html