2.9waitpid函数

默认是阻塞的可以设置为非阻塞并且指定进程其余功能和wait类似

/*
    #include <sys/types.h>
    #include <sys/wait.h>
    pid_t waitpid(pid_t pid, int *wstatus, int options);
        功能:回收指定进程号的子进程,可以设置是否阻塞
        参数:
            pid:
                pid>0:某个子进程pid
                pid=0:回收当前进程组的任意子进程
                pid=-1:回收所有的子进程,相当于wait() 最常用
                pid<-1:回收某个进程组的组id的绝对值,回收指定进程组的子进程 如回收2组子进程资源传递(-2)
            int *wstatus
            进程退出时的状态信息,传入的是一个int类型的地址,传出参数

            options:设置是否阻塞
                0:阻塞
                WNOHANG:非阻塞
            返回值
                >0:返回子进程的id
                =0:options=WNOHANG,表示还有子进程
                =-1:错误,或者没有子进程

*/
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.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)
        {
            printf("i am parent pid = %d\n", getpid());
            sleep(1);
                   
            // int ret = wait(NULL);
            int st;
            // int ret=waitpid(-1,&st,0);
            int ret = waitpid(-1, &st, WNOHANG); //非阻塞父进程不用在这一直挂起

            if (ret == -1) //没有子进程了就退出
            {
                break;
            }
            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);
        }
        exit(0);
    }
    return 0; // exit(0)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值