C/Zombies

From Attie's Wiki
Revision as of 12:29, 3 March 2010 by Attie (Talk | contribs)

Jump to: navigation, search

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

Variants
Actions
Navigation
Toolbox