C/Zombies
From Attie's Wiki
(Difference between revisions)
Line 3: | Line 3: | ||
Assume <code>sock</code> is the file descriptor that you wish to read from... | Assume <code>sock</code> is the file descriptor that you wish to read from... | ||
<pre> | <pre> | ||
− | + | /* tidy up after children, but accept new data if its there! */ | |
− | + | while (children) { | |
− | + | int pid, status, read; | |
− | + | struct timeval timeout; | |
− | + | fd_set toset; | |
− | + | /* check if any children have become zombies! */ | |
− | + | pid = waitpid(-1,&status,WNOHANG | WUNTRACED); | |
− | + | if (pid > 0) { | |
− | + | children--; | |
− | + | printf("*** Child Died *** PID: %-6d Status: %-3d Children: %-2d\n",pid,WEXITSTATUS(status),children); | |
− | + | } | |
− | + | /* if there are no children left, then we dont need to be here anymore... */ | |
− | + | if (!children) break; | |
− | + | /* timeout on the socket every 0.5sec */ | |
− | + | memset(&timeout,0,sizeof(timeout)); | |
− | + | timeout.tv_usec = 500000; | |
− | + | FD_ZERO(&toset); | |
− | + | FD_SET(sock,&toset); | |
− | + | /* check if there is data in the socket to be read... */ | |
− | + | if ((read = select(sock+1,&toset,NULL,NULL,&timeout)) == -1) { | |
− | + | perror("select()"); | |
− | + | break; | |
− | + | } else if (read != 0) { | |
− | + | /* something can be read! */ | |
− | + | break; | |
− | + | ||
} | } | ||
+ | } | ||
</pre> | </pre> |
Revision as of 12:30, 3 March 2010
The code below will quickly tidy up after zombie children, and at the same time check for incoming data.
Assume sock
is the file descriptor that you wish to read from...
/* tidy up after children, but accept new data if its there! */ while (children) { int pid, status, read; struct timeval timeout; fd_set toset; /* check if any children have become zombies! */ pid = waitpid(-1,&status,WNOHANG | WUNTRACED); if (pid > 0) { children--; printf("*** Child Died *** PID: %-6d Status: %-3d Children: %-2d\n",pid,WEXITSTATUS(status),children); } /* if there are no children left, then we dont need to be here anymore... */ if (!children) break; /* timeout on the socket every 0.5sec */ memset(&timeout,0,sizeof(timeout)); timeout.tv_usec = 500000; FD_ZERO(&toset); FD_SET(sock,&toset); /* check if there is data in the socket to be read... */ if ((read = select(sock+1,&toset,NULL,NULL,&timeout)) == -1) { perror("select()"); break; } else if (read != 0) { /* something can be read! */ break; } }