linux多进程基础(3):waitpid()函数

本文详细介绍了waitpid函数,相比于wait,它允许指定特定PID或进程组,支持阻塞和非阻塞模式。通过实例对比,展示了waitpid如何在主函数中实现非阻塞等待子进程结束。
摘要由CSDN通过智能技术生成

前文已经讲解了wait函数,这一篇要讲的是waitpid()函数.

waitpid()函数与wait()函数目的一致:回收子进程资源,但它比 wait() 更灵活,其可以指定要等待的子进程的 PID(进程ID),并且可以设置函数是阻塞还是非阻塞的,当设置为非阻塞的,主函数将不再等待子函数执行.

1.waitpid()函数定义

pid_t waitpid(pid_t pid, int *status, int options);

其中:

pid

        若pid>0:回收某个子进程的PID;

        若pid=0:回收当前进程组的所有子进程;

        若pid=-1:回收所有的子进程,相当与wait()函数;

        若pid<-1:回收指定进程组中的子进程.

status

        一个指针,用于存储子进程的退出状态。

options

        设置阻塞或者非阻塞。0为阻塞,WNOHANG 选项为非阻塞。

返回值:

        >0:返回子进程的ID;

        =0:表示还有子进程;

        =-1:错误或者已无子进程.

2.举例

 为了更好的帮助大家理解wait()h和waitpid()函数的区别,我先写一个简单的wait函数的代码,主要演示使用wait函数,主函数会阻塞,直到子函数运行完后才能接着运行,代码如下:

#include <sys/types.h>
#include <unistd.h>
#include<iostream>
#include <sys/wait.h>

int main(void){
    pid_t pid=fork();
    if(pid>0){
        wait(&pid);
        std::cout<<"我是父进程,我等你子进程"<<std::endl;
    }
    else if(pid==0){
        int i=0;
        while(i<3){
            std::cout<<"我是子进程,我的ID是:"<<getpid()<<",我的父进程ID是:"<<getppid()<<std::endl;
            i++;
            sleep(1);
         }
    }
}

运行程序得到:

可以看到, 主函数阻塞,直到子函数运行完后才能接着运行.

接下来我们将wait替换成waitpid,代码如下:

#include <sys/types.h>
#include <unistd.h>
#include<iostream>
#include <sys/wait.h>
int main(void){
    pid_t pid=fork();
    if(pid>0){
        waitpid(-1,&pid,WNOHANG);
        std::cout<<"我是父进程,我等你子进程"<<std::endl;
    }
    else if(pid==0){
        int i=0;
        while(i<3){
            std::cout<<"我是子进程,我的ID是:"<<getpid()<<",我的父进程ID是:"<<getppid()<<std::endl;
            i++;
            sleep(1);
         }
    }
}

运行程序得到结果:

可以发现,主进程并没有因为等待子进程而发生阻塞.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值