4
4
#define SO_REUSEADDR 2
5
5
#define SOL_SOCKET 1
6
6
#define O_RDONLY 0
7
+ #define WNOHANG 1
7
8
8
9
typedef unsigned short uint16_t ;
9
10
typedef unsigned int uint32_t ;
@@ -19,6 +20,8 @@ typedef struct {
19
20
char sin_zero [8 ]; /* 16 */
20
21
} sockaddr_in_t ;
21
22
23
+ struct rusage ;
24
+
22
25
ssize_t read (int fd , void * buf , size_t nbyte );
23
26
ssize_t write (int fd , const void * buf , size_t nbyte );
24
27
int open (const char * path , int flags );
@@ -31,6 +34,7 @@ int listen(int socket, int backlog);
31
34
int setsockopt (int socket , int level , int option_name , const void * option_value ,
32
35
socklen_t option_len );
33
36
int fork ();
37
+ int wait4 (int pid , int * wstatus , int options , struct rusage * rusage );
34
38
void exit (int status );
35
39
36
40
static size_t strlen (const char * s ) {
@@ -164,6 +168,7 @@ int main(int argc, char *argv[]) {
164
168
sock = tcp_listen (& addr , & yes , sizeof (yes ));
165
169
while (1 ) {
166
170
int pid , clientfd ;
171
+ while (wait4 (-1 , 0 , WNOHANG , 0 ) > 0 );
167
172
if ((clientfd = accept (sock , 0 , 0 )) < 0 ) {
168
173
perror ("accept" );
169
174
} else if ((pid = fork ()) < 0 ) {
0 commit comments