| .TH WAIT 3 | 
 | .SH NAME | 
 | await, awaitnohang, awaitfor, wait, waitnohang, waitfor, waitpid \- wait for a process to exit | 
 | .SH SYNOPSIS | 
 | .B #include <u.h> | 
 | .br | 
 | .B #include <libc.h> | 
 | .PP | 
 | .B | 
 | Waitmsg*	wait(void) | 
 | .PP | 
 | .B | 
 | Waitmsg*	waitnohang(void) | 
 | .PP | 
 | .B | 
 | Waitmsg*	waitfor(int pid) | 
 | .PP | 
 | .B | 
 | int 		waitpid(void) | 
 | .PP | 
 | .B | 
 | int 		await(char *s, int n) | 
 | .PP | 
 | .B | 
 | int		awaitnohang(char *s, int n) | 
 | .PP | 
 | .B | 
 | int		awaitfor(int pid, char *s, int n) | 
 | .SH DESCRIPTION | 
 | .I Wait | 
 | causes a process to wait for any child process (see | 
 | .IR fork (2) | 
 | and | 
 | .IR rfork (3)) | 
 | to exit. | 
 | It returns a | 
 | .B Waitmsg | 
 | holding | 
 | information about the exited child. | 
 | A | 
 | .B Waitmsg | 
 | has this structure: | 
 | .IP | 
 | .EX | 
 | .ta 6n +\w'long 'u +\w'msg[ERRLEN];     'u | 
 | typedef | 
 | struct Waitmsg | 
 | { | 
 | 	int pid;	/* of loved one */ | 
 | 	ulong time[3];	/* of loved one & descendants */ | 
 | 	char	*msg; | 
 | } Waitmsg; | 
 | .EE | 
 | .PP | 
 | .B Pid | 
 | is the child's | 
 | process id. | 
 | The | 
 | .B time | 
 | array contains the time the child and its descendants spent in user code, | 
 | the time spent in system calls, and the child's elapsed real time, | 
 | all in units of milliseconds. | 
 | .B Msg | 
 | contains the message that the child specified in | 
 | .IR exits (3). | 
 | For a normal exit, | 
 | .B msg[0] | 
 | is zero, | 
 | otherwise | 
 | .B msg | 
 | is the exit string | 
 | prefixed by the process name, a blank, the process id, and a colon. | 
 | .PP | 
 | If there are no more children to wait for, | 
 | .I wait | 
 | returns immediately, with return value nil. | 
 | .PP | 
 | The | 
 | .B Waitmsg | 
 | structure is allocated by | 
 | .IR malloc (3) | 
 | and should be freed after use. | 
 | For programs that only need the pid of the exiting program, | 
 | .I waitpid | 
 | returns just the pid and discards the rest of the information. | 
 | .PP | 
 | .I Waitnohang | 
 | is like | 
 | .I wait | 
 | but does not block if there are no more children to wait for. | 
 | Instead it returns immediately and sets | 
 | .IR errstr . | 
 | .PP | 
 | .I Waitfor | 
 | is like | 
 | .I wait | 
 | but waits for a particular | 
 | .IR pid . | 
 | .PP | 
 | The underlying calls are | 
 | .IR await , | 
 | .IR awaitnohang , | 
 | and | 
 | .IR awaitfor , | 
 | which fill in the  | 
 | .IR n -byte | 
 | buffer | 
 | .I s | 
 | with a textual representation of the pid, times, and exit string. | 
 | There is no terminal NUL. | 
 | The return value is the length, in bytes, of the data. | 
 | .PP | 
 | The filled-in buffer | 
 | may be parsed (after appending a NUL) using | 
 | .IR tokenize | 
 | (see | 
 | .IR getfields (3)); | 
 | the resulting fields are, in order, pid, the three times, and the exit string, | 
 | which will be | 
 | .B '' | 
 | for normal exit. | 
 | If the representation is longer than | 
 | .I n | 
 | bytes, it is truncated but, if possible, properly formatted. | 
 | The information that does not fit in the buffer is discarded, so | 
 | a subsequent call to | 
 | .I await | 
 | will return the information about the next exiting child, not the remainder | 
 | of the truncated message. | 
 | In other words, each call to | 
 | .I await | 
 | returns the information about one child, blocking if necessary if no child has exited. | 
 | If the calling process has no living children, | 
 | .I await | 
 | returns | 
 | .BR -1 . | 
 | .SH SOURCE | 
 | .B \*9/src/lib9/wait.c | 
 | .PP | 
 | .B \*9/src/lib9/await.c | 
 | .SH "SEE ALSO" | 
 | .IR rfork (3), | 
 | .IR exits (3), | 
 | .SH DIAGNOSTICS | 
 | These routines set | 
 | .IR errstr . | 
 | .SH BUGS | 
 | To avoid name conflicts with the underlying system, | 
 | .IR wait , | 
 | .IR waitpid , | 
 | and | 
 | .I waitfor | 
 | are preprocessor macros defined as | 
 | .IR p9wait , | 
 | .IR p9waitpid , | 
 | and | 
 | .IR p9waitfor ; | 
 | see  | 
 | .IR intro (3). |