友链
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
/*
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid, int *wstatus, int options);
回收指定进程号的进程
如果pid参数为0,那么就表示回收当前进程组的所有进程
如果pid为-1,就表示回收所有的子进程,不管是不是在同一个进程组
如果pid<-1,回收某个进程组的所有子进程,pid的绝对值就是组id
options参数用于设置阻塞或者非阻塞
0是阻塞
WNOHANG是非阻塞
返回值如果大于0就是被回收的子进程的pid
=0表示还有子进程
=-1表示已经没有子进程了
*/
pid_t pid;
// 现在有一个父进程,我们创建5个子进程
for (int i = 0; i < 5; i++)
{
pid = fork();
if (pid == 0)
break; //防止子进程再创建子进程
}
if (pid > 0)
{
while (1)
{
sleep(1);
printf("PARENT, pid: %d\n", getpid());
int st;
int ret = waitpid(-1, &st, WNOHANG);
if (ret == -1)
{
break;
}
// 表示还有子进程
else if (ret == 0)
{
continue;
}
// 表示回收了一个子进程
else if (ret > 0)
{
if (WIFEXITED(st))
{
printf("退出的状态码是: %d\n", WEXITSTATUS(st));
}
if (WIFSIGNALED(st))
{
printf("被 %d 信号终止了\n", WTERMSIG(st));
}
printf("child dead, pid = %d\n", ret);
}
}
}
if (pid == 0)
{
while (1)
{
sleep(1);
printf("CHILD, pid: %d\n", getpid());
}
}
return 0;
}