函数原型
pid_t waitpid(pid_t pid, int *status, in options);
作用:回收子进程
参数:
① pid:
pid == -1 等待任一子进程。与wait等效。
pid > 0 等待其进程ID与pid相等的子进程。
id == 0 等待其组ID等于调用进程的组I D的任一子进程
pid < -1 等待其组ID等于pid的绝对值的任一子进程
② status: 子进程的退出状态,用法同wait函数
③ options:设置为WNOHANG,函数非阻塞,设置为0,函数阻塞
返回值:
>0:返回清理掉的子进程ID;
-1:无子进程
=0:参3为WNOHANG,且子进程正在运行。
测试源码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/wait.h>
int counter = 200;
int main(int argc, const char* argv[])
{
int i;
pid_t pid;
for(i=0; i<5; ++i)
{
pid = fork();
if(pid == 0)
{
break;
}
}
if(i<5)
{
counter += 300;
printf(" child process , pid = %d, ppid = %d\n", getpid(), getppid());
printf("counter = %d\n\n", counter);
sleep(10);
}
else if(i == 5)
{
counter += 100;
printf(" parent process, pid = %d, ppid = %d\n", getpid(), getppid());
printf("counter = %d\n\n", counter);
// 父进程, 回收子进程资源
int status;
pid_t wpid;
while( (wpid = waitpid(0, &status, WNOHANG)) != -1 )
{
if(wpid == 0)
continue;
printf("------child died pid = %d\n", wpid);
if(WIFEXITED(status))
{
printf("process exit by number: %d\n", WEXITSTATUS(status));
}
else if(WIFSIGNALED(status))
{
printf("process exit by signal: %d\n", WTERMSIG(status));
}
}
}
return 10;
}
测试结果
关键代码分析
1、waitpid会等待子进程的退出后父进程再结束。
2、waitpid的函数的返回值可以用来作为不同的应用。