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

运行结果:

在另一个终端中用kill命令杀死子进程:


参考:牛客网 C++高薪求职项目《Linux高并发服务器开发》2.9 waitpid函数

专属优惠链接:

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

猜你喜欢

转载自blog.csdn.net/m0_38062470/article/details/113797779
2.9