version 1.20, 1998/09/08 15:24:38 |
version 1.21, 1998/09/10 16:06:40 |
|
|
{ |
{ |
struct child *cp; |
struct child *cp; |
sigset_t nset, oset; |
sigset_t nset, oset; |
|
int rv = 0; |
|
|
sigemptyset(&nset); |
sigemptyset(&nset); |
sigaddset(&nset, SIGCHLD); |
sigaddset(&nset, SIGCHLD); |
sigprocmask(SIG_BLOCK, &nset, &oset); |
sigprocmask(SIG_BLOCK, &nset, &oset); |
|
/* |
if ((cp = findchild(pid, 0)) == NULL) |
* If we have not already waited on the pid (via sigchild) |
return(-1); |
* wait on it now. Otherwise, use the wait status stashed |
|
* by sigchild. |
while (!cp->done) |
*/ |
sigsuspend(&oset); |
cp = findchild(pid, 1); |
wait_status = cp->status; |
if (cp == NULL || !cp->done) |
delchild(cp); |
rv = waitpid(pid, &wait_status, 0); |
|
else |
|
wait_status = cp->status; |
|
if (cp != NULL) |
|
delchild(cp); |
sigprocmask(SIG_SETMASK, &oset, NULL); |
sigprocmask(SIG_SETMASK, &oset, NULL); |
return((WIFEXITED(wait_status) && WEXITSTATUS(wait_status)) ? -1 : 0); |
if (rv == -1 || (WIFEXITED(wait_status) && WEXITSTATUS(wait_status))) |
|
return(-1); |
|
else |
|
return(0); |
} |
} |
|
|
/* |
/* |
|
|
sigemptyset(&nset); |
sigemptyset(&nset); |
sigaddset(&nset, SIGCHLD); |
sigaddset(&nset, SIGCHLD); |
sigprocmask(SIG_BLOCK, &nset, &oset); |
sigprocmask(SIG_BLOCK, &nset, &oset); |
|
if ((cp = findchild(pid, 0)) != NULL) { |
if ((cp = findchild(pid, 0)) == NULL) |
if (cp->done) |
return; |
delchild(cp); |
|
else |
if (cp->done) |
cp->free = 1; |
delchild(cp); |
} |
else |
|
cp->free = 1; |
|
sigprocmask(SIG_SETMASK, &oset, NULL); |
sigprocmask(SIG_SETMASK, &oset, NULL); |
} |
} |
|
|