diff options
Diffstat (limited to 'sys/cmd/rc/wait.c')
-rw-r--r-- | sys/cmd/rc/wait.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/sys/cmd/rc/wait.c b/sys/cmd/rc/wait.c index 4d45e4b..911601c 100644 --- a/sys/cmd/rc/wait.c +++ b/sys/cmd/rc/wait.c @@ -27,6 +27,10 @@ await(int pid4, int opt, struct WaitMsg *msg) /* event loop */ for(;;){ if((pid = wait4(pid4, &status, opt, &ru)) <= 0){ + if(errno == ECHILD){ + msg->pid = -1; + return 1; + } msg->pid = 0; perror("failed wait4"); return 0; @@ -168,9 +172,16 @@ waitall(Thread *job) struct WaitMsg msg; while(shouldwait(job) && await(-job->pgid, WUNTRACED, &msg)){ - if(msg.pid == 0){ + switch(msg.pid){ + case 0: // error perror("wait job"); return 0; + case -1: // no children: assume they have exited + job->wait.status = Pdone; + clearwait(job); + return 1; + default: + ; } notify(job, msg); @@ -186,9 +197,16 @@ waitfor(Thread *job, int pid) struct WaitMsg msg; while(shouldwait(job) && await(-job->pgid, WUNTRACED, &msg)){ - if(msg.pid == 0){ + switch(msg.pid){ + case 0: // error perror("wait for"); return 0; + case -1: // no children: assume they have exited + job->wait.status = Pdone; + clearwait(job); + return 1; + default: + ; } notify(job, msg); |