天天看點

2.9 waitpid函數

#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;
}
           

運作結果:

2.9 waitpid函數

在另一個終端中用kill指令殺死子程序:

2.9 waitpid函數
2.9 waitpid函數

參考:牛客網 C++高薪求職項目《Linux高并發伺服器開發》2.9 waitpid函數

專屬優惠連結:

https://www.nowcoder.com/courses/cover/live/504?coupon=AvTPnSG