#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
功能:回收指定程序号的子程序,可以設定是否阻塞
參數:
-pid:
pid > 0:某個子程序的ID,回收該子程序
pid = 0:回收目前程序組的任意子程序 (常用,在不把子程序送給其他程序組時)
pid = -1:回收任意的子程序,相當于wait() (最常用)
pid < -1:某個程序組的組ID的絕對值,回收該程序組中的任意子程序
-options:設定阻塞或者非阻塞
0:阻塞
WNOHANG:非阻塞
傳回值:
>0:傳回子程序的id
=0:options=WNOHANG,表示還有子程序活着
=-1:錯誤,或者沒有子程序了
程式:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>
#include <stdlib.h>
int main()
{
//有一個父程序,建立5個子程序(兄弟)
pid_t pid;
//建立5個子程序
for (int i = 0; i < 5; i++)
{
pid = fork();
if (pid == 0) //子程序中不建立
{
break;
}
}
if (pid > 0)
{ //父程序
while (1)
{
sleep(2);
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 die,pid=%d\n", ret);
}
}
}
else if (pid == 0)
{ //子程序
while (1)
{
printf("child, pid=%d\n", getpid());
sleep(1);
}
}
return 0;
}
運作結果:

在另一個終端中用kill指令殺死子程序:
參考:牛客網 C++高薪求職項目《Linux高并發伺服器開發》2.9 waitpid函數
專屬優惠連結:
https://www.nowcoder.com/courses/cover/live/504?coupon=AvTPnSG