aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/wait.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/rc/wait.c')
-rw-r--r--sys/cmd/rc/wait.c22
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);