C/Zombies

From Attie's Wiki
(Difference between revisions)
Jump to: navigation, search
Line 1: Line 1:
 
The code below will quickly tidy up after zombie children, and at the same time check for incoming data.
 
The code below will quickly tidy up after zombie children, and at the same time check for incoming data.
  
Assume <code>sock</code> is the file descriptor that you wish to read from...
+
o Assume <code>sock</code> is the file descriptor that you wish to read from<br>
 +
o <code>children</code> is incremented when you call fork()
 
<pre>
 
<pre>
 
/* tidy up after children, but accept new data if its there! */
 
/* tidy up after children, but accept new data if its there! */

Revision as of 12:31, 3 March 2010

The code below will quickly tidy up after zombie children, and at the same time check for incoming data.

o Assume sock is the file descriptor that you wish to read from
o children is incremented when you call fork()

/* 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;
  }
}
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox