进程等待-wait和waitpid

目录

1.为什么要进程等待

2.如何进程等待?

1.wait函数

2.waitpid

1.pid

2.status

3.options/非堵塞轮询


1.为什么要进程等待

1.子进程退出,如果父进程没有退出,那么子进程就会变成僵尸状态。僵尸状态会变得刀枪不入,kiil -9命令也不可以杀死。

2.但是僵尸进程问题,可能会存在内存泄露问题。(因此需要进程等待,让父进程将其收回)

3.父进程需要知道子进程返回的情况如何。结果对不对,是否正常退出。

2.如何进程等待?

1.wait函数

:!man 3 wait查看文档

我们可以通过下面的代码,简单了解一下wait函数,wait函数里面的参数等到waitpid的时候再讲,两者没有区别的。本质是一样的。

通过下面的现象会发现:我们wait一直在等待子进程退出,而父进程没有到wait函数的时候,子进程就出于僵尸模式,然后wait函数回收,只有父进程在进行着。

但是如果父进程进行到wait函数,但是子进程没有结束会发生什么?

结果就是wait函数使父进程停滞,处在堵塞状态:

如果有多个子进程,wait函数可等待任意一个子进程。

2.waitpid

:!man waitpid 之后按g到文档开头

1.pid

1.如果实参是-1,那么就会和wait函数一样,等待任意一个子进程,如果是>0,就会等待和pid一样的进程ID的进程。

2.status

`status这个形参就是要解决为什么中的第3个。

那子进程返回有几种情况呢?子进程也是进程,其实就是进程退出的三种情况:

我们先看一下运行结果:

最后是256,而不是我们所想象的1,为什么呢?

core dump标志我们暂时不用管:   1 0000 0000  是不是就是256了?

但是系统不需要我们知道,他提供了宏函数:

3.options/非堵塞轮询

上面讲到如果子进程不退出,父进程的进程等待会一直等待,堵塞在那里,父进程什么事也做不了,所以非堵塞轮询就是解决这个问题,让父进程不仅可以等待子进程回收,也能干点自己的事情。(但不要这些事不要太复杂,不然就本末倒置了)

我们就可以写一下程序模拟一下:

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值