child = waitpid (pid, &status, options);
child = __waitpid (pid, &status, options);
waitid (idtype, id, infop, options)     idtype_t idtype;     id_t id;     siginfo_t *infop;     int options;{  pid_t pid, child;  int status;  switch (idtype)    {    case P_PID:      if(id <= 0)	goto invalid;      pid = (pid_t) id;      break;    case P_PGID:      if (id < 0 || id == 1)	goto invalid;      pid = (pid_t) -id;      break;    case P_ALL:      pid = -1;      break;    default:    invalid:      __set_errno (EINVAL);      return -1;    }  /* Technically we're supposed to return EFAULT if infop is bogus,     but that would involve mucking with signals, which is     too much hassle.  User will have to deal with SIGSEGV/SIGBUS.     We just check for a null pointer. */  if (infop == NULL)    {      __set_errno (EFAULT);      return -1;    }  child = waitpid (pid, &status, options);  if (child == -1)    /* `waitpid' set `errno' for us.  */    return -1;  if (child == 0)    {      /* The WHOHANG bit in OPTIONS is set and there are children available	 but none has a status for us.  The XPG docs do not mention this	 case so we clear the `siginfo_t' struct and return succesfully.  */      infop->si_signo = 0;      infop->si_code = 0;      return 0;    }  /* Decode the status field and set infop members... */  infop->si_signo = SIGCHLD;  infop->si_pid = child;  infop->si_errno = 0;  if (WIFEXITED (status))    {      infop->si_code = CLD_EXITED;      infop->si_status = WEXITSTATUS (status);    }  else if (WIFSIGNALED (status))    {      infop->si_code = WCOREDUMP (status) ? CLD_DUMPED : CLD_KILLED;      infop->si_status = WTERMSIG (status);    }  else if (WIFSTOPPED (status))    {      infop->si_code = CLD_STOPPED;      infop->si_status = WSTOPSIG (status);    }#ifdef WIFCONTINUED  else if (WIFCONTINUED (status))    {      infop->si_code = CLD_CONTINUED;      infop->si_status = SIGCONT;    }#endif  else    /* Can't happen. */    assert (! "What?");  return 0;}