|
|
1.1 ! root 1: # include <useful.h> ! 2: # include <errno.h> ! 3: # include <sccs.h> ! 4: ! 5: SCCSID(@(#)fullwait.c 8.3 2/8/85) ! 6: ! 7: /* ! 8: ** FULLWAIT -- performs a wait(II) primitive for a given child. ! 9: ** ! 10: ** The wait primitive is executed as many times as needed to get ! 11: ** termination status for a given child. The case of an interrupt ! 12: ** during the wait is handled. No other children may die during ! 13: ** the wait. Also, the child must die "normally", that is, as the ! 14: ** result of an exit() system call, or from an interrupt. ! 15: ** ! 16: ** Parameters: ! 17: ** "child" -- the pid of the child process to wait for, ! 18: ** returned from the fork() system call. ! 19: ** "name" -- a character string representing the name of ! 20: ** the calling routine; printed on syserr's. ! 21: ** Returns: ! 22: ** The exit parameter of the child process. ! 23: */ ! 24: ! 25: fullwait(child, name) ! 26: int child; ! 27: char *name; ! 28: { ! 29: auto int st; ! 30: register int i; ! 31: extern int errno; ! 32: register char *n; ! 33: register char *coredump; ! 34: ! 35: n = name; ! 36: ! 37: /* wait for a child to die */ ! 38: while ((i = wait(&st)) != child) ! 39: { ! 40: /* it is not the child we want; chew on it a little more */ ! 41: if (i != -1) ! 42: syserr("%s: unexpected child: pid %d st 0%o", n, i, st); ! 43: ! 44: /* check for interrupted system call */ ! 45: if (errno != EINTR) ! 46: { ! 47: /* wait with no child */ ! 48: syserr("%s: no child", n); ! 49: } ! 50: errno = 0; ! 51: ! 52: /* dropped out from signal: reexecute the wait */ ! 53: } ! 54: ! 55: /* check termination status */ ! 56: i = st & I1MASK; ! 57: if (i > 2) ! 58: { ! 59: /* child collapsed */ ! 60: if (i & 0200) ! 61: { ! 62: coredump = " -- core dumped"; ! 63: i &= 0177; ! 64: } ! 65: else ! 66: { ! 67: coredump = ""; ! 68: } ! 69: syserr("bad status %s: stat %d%s", n, i, coredump); ! 70: } ! 71: ! 72: /* return exit status */ ! 73: return (st >> 8); ! 74: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.