Linux下什么是进程等待?为什么进程需要等待?

当一个进程创建了新的进程时,父进程(原进程)往往需要读取子进程(新进程)的运行结果。如果子进程先于父进程退出,而父进程不能及时读取子进程的退出状态的话,子进程便会一直存在,此时子进程便会变成僵尸状态。久而久之,便会造成内存泄漏!

那么为了避免内存泄漏,我们可以通过kill指令销毁掉父进程,那么僵尸进程便也会随之销毁。但是这样做只是治标不治本,我们应该从根源上来处理,那就是应该避免产生僵尸进程,即让父进程及时地读取子进程的退出状态>>进程等待!!!

此时又会引入两个概念:阻塞和非阻塞

阻塞:为了完成一个功能发起一次函数调用,如果没有完成这个功能则一直等待,直到功能完成才返回。举个例子,就像去饭店吃饭一样,当你很想吃某种食物的时候,即使你前边还有很多人排队买饭,你也会一直等,直到最后吃到自己喜欢的食物。

非阻塞:为了完成一个功能发起一次函数调用,如果现在不具备该功能完成的条件,则不等待立即返回。它就像是你打算去饭店吃饭,结果看到那个饭店人特别多,然后你转身就走了一样,最后的结果是你并没有吃到那家饭店的饭。

在linux中,有两种等待函数:

pid_t wait(int *status);    //阻塞式等待

上面提到过阻塞和非阻塞,那么wait()函数便是阻塞式等待函数。

功能:等待任意子进程退出,如果没有子进程退出就一直等待。其中的参数status即是获取子进程的退出状态,如果不关心,则置为NULL。

返回值:成功返回被等待子进程的pid,失败返回-1

//可以设置成阻塞式等待,也可以是非阻塞式等待
pid_t waitpid(pid_t pid,int *status,int opitions);

waitpid()函数的功能:可以等待指定的子进程退出,也可以等待任意子进程退出。

可以看到该函数有3个参数:pid、status、opitions

pid:-1      等待任意子进程退出;

          >0    等待进程id=pid的子进程退出

status:获取子进程的退出状态

       

 WIFEXITED(status);     // 子进程代码运行完毕正常退出
 WEXITSTATUS(status);   //如果WIFEXITED非零,读取子进程的退出码


 
 WIFSIGNALED(status);   //异常信号导致退出
 WTERMSIG(status);      //如果WIFSIGNALED非零,返回异常信号

opitions:选项参数

      WNOHANG:如果没有子进程退出则立即报错返回0,不等待;如果有则回收资源

当pid取-1,opitions默认取0时,此时就等同于wait()函数,即阻塞等待任意子进程退出。

返回值:如果子进程正常退出,则返回子进程的pid;

                如果设置了选项WNOHANG,且此时没有子进程退出则返回0;

                如果调用出错,则返回-1

 

关于子进程的退出码获取:status中存储了子进程的退出原因及退出码,虽然该参数用了4个字节来获取,但实际上只用了低16的两个字节来存储,其中高8位用来存储子进程的退出码,低8位用来存储子进程异常退出的信号值。   当子进程正常退出时,其退出码可用 status>>8 & 0xff 来获取,此时低8位为0;当子进程异常退出时,可用 status & 0x7f 来获取使进程异常退出的信号值,此时高8位为0。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值