wait和waitpid函数

#include 
pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
//若成功返回进程ID,出错则为0或-1
//没有子进程时,返回-1,百度查的

如果调用wait的进程没有已终止的子进程,不过有一个或多个子进程仍在执行,那么wait将阻塞到现有子进程第一个终止为止。

waitpid函数就等待哪个进程以及是否阻塞给了我们更多的控制。首先,pid参数允许我们指定想等待的进程ID,-1表示等待第一个终止的子进程。options参数允许我们指定附加选项。最常用的选项是WNOHANG,它告知内核在没有终止子进程时不要阻塞。

waitpid存在的意义:Unix信号是不排队的,通过把waitpid设置为非阻塞,如下面的代码那样,才能等待调用waitpid之前的所有已终止的子进程。

void
sig_chld(int signo)
{
  pid_t pid;
  int stat;
  while((pid=waitpid(-1,&stat,WNOHANG))>0)
    printf("child %d terminated\n",pid);
  return;
}
//这个函数不阻塞于waitpid,这是wait不具备的。
//该函数可以将调用这个函数时刻的所有已结束的子进程wait掉,而且不阻塞等待。
while(wait(NULL)>0));
//阻塞等待所有子进程结束。

你可能感兴趣的:(wait和waitpid函数)