waitpid() 的返回值的 3 种情况:
1) 当正常返回的时候,waitpid() 返回收集到的已经回收子进程的进程号;、
2) 如果设置了选项 WNOHANG,
1.而调用中 waitpid() 发现没有已退出的子进程可等待,则返回 0;
2. 如果调用中出错,则返回-1,这时 errno 会被设置成相应的值以指示错误所在如:当 pid 所对应的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid() 就会出错返回,这时 errno 被设置为 ECHILD;
pid_t waitpid(pid_t pid, int *status, int options);
功能:等待子进程终止,如果子进程终止了,此函数会回收子进程的资源。
参数 pid 的值有以下几种类型:
1.pid > 0 等待进程 ID 等于 pid 的子进程。
2.pid = 0 等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,
waitpid 不会等待它。3.pid = -1 等待任一子进程。
3.pid < -1 等待指定进程组中的任何子进程,这个进程组的 ID 等于 pid 的绝对值。
status : 进程退出时的状态信息。
options : options 提供了一些额外的选项来控制 waitpid()。
0:阻塞父进程,等待子进程退出。
WNOHANG:没有任何已经结束的子进程,则立即返回。
WUNTRACED:如果子进程暂停了则此函数马上返回,并且不予以理会子进程的结束状态。
#include <stdio.h>
#include <unistd.h>
#include<sys/wait.h>
#define N 3
int main(int argc, const char** argv) {
int i;
for ( i = 0; i < N; i++)
{
__pid_t pid = fork();
if (pid==0)
{
break;//防止子进程创建孙进程
}
}
if (i == 0) // 子进程1
{
int j = 8;
for (; j >0; j--)
{
printf("子进程%d剩余时间%ds\n", getpid(), j);
sleep(1);
}
_exit(-1);
}
else if (i==1)//子进程2
{
int j = 3;
for (; j >0; j--)
{
printf("子进程%d剩余时间%ds\n", getpid(), j);
sleep(1);
}
_exit(-1);
}
else if (i==2)//子进程3
{
int j = 5;
for (; j >0; j--)
{
printf("子进程%d剩余时间%ds\n", getpid(), j);
sleep(1);
}
_exit(-1);
}
else if (i==N)//父进程
{
while (1)
{
__pid_t pid = waitpid(-1, NULL, WNOHANG);
if(pid>1)
{
printf("子进ID:%d程退出了\n", pid);
}
else if (pid==0)//还有子进程进行
{
continue;
}
else if(pid==-1)
{
break;
}
}
}
while (1)
;
return 0;
}