子进程回收waitpid()与wait()

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *statloc)
pid_t waitpid(pid_t pid,int *statloc,int options)
功能:

功能:当子进程终止时返回,主要用来处理已终止的子进程。当子进程处理完任务后,处于僵死状态,也就成为了僵死进程,父类可以通过上面两个函数捕获到,从而处理掉僵死进程,归还内存、CPU等资源。


提问:如果父进程没有处理,放任僵死进程横行,最后父进程消亡了怎么办?

答: 父进程消亡了,子进程就变成了孤儿进程,将孤儿进程的父进程id设置为1,也就是init进程,最后由init进程处理这些僵死的孤儿进程。

pid_t wait(int *statloc)

有两个返回参数,直接返回的pid_t 是已经返回的子进程ID(如果错误返回0或者-1),statloc子进程终止状态,可由终止状态知道子进程的死因(正常死亡、由信号杀死、任务作业控制停止)。

wait 是阻塞的,如果调用wait的进程没有子进程终止,不过有一个或者多个子进程在运行,那么wait将阻塞到第一个子进程终止为止。

pid_t waitpid(pid_t pid,int *statloc,int options)
有两个输入参数和两个返回值。返回值与wait的返回相同。
两个输入参数:
pid_t pid:   可以用于指定调用waitpid的进程的在等待特定子进程返回。如果pid = -1,表示第一个返回的子进程。
options:     允许我们制定附加选项
                          WNOHANG 如果没有任何已经结束的子进程则马上返回, 不予以等待。  

                        WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。  

                        子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:  

                        WIFEXITED(status)如果子进程正常结束则为非 0 值。  

                        WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用

                        WIFEXITED 来判断是否正常结束才能使用此宏。  

                        WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真  

                        WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏。  

                        WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用 WUNTRACED 时才会有此情况。  

                        WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏。

waitpid是不阻塞的,当pid = -1时,与wait相同。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值