目录
1.子进程退出,如果父进程没有退出,那么子进程就会变成僵尸状态。僵尸状态会变得刀枪不入,kiil -9命令也不可以杀死。
2.但是僵尸进程问题,可能会存在内存泄露问题。(因此需要进程等待,让父进程将其收回)
3.父进程需要知道子进程返回的情况如何。结果对不对,是否正常退出。
:!man 3 wait查看文档
我们可以通过下面的代码,简单了解一下wait函数,wait函数里面的参数等到waitpid的时候再讲,两者没有区别的。本质是一样的。
通过下面的现象会发现:我们wait一直在等待子进程退出,而父进程没有到wait函数的时候,子进程就出于僵尸模式,然后wait函数回收,只有父进程在进行着。
但是如果父进程进行到wait函数,但是子进程没有结束会发生什么?
结果就是wait函数使父进程停滞,处在堵塞状态:
如果有多个子进程,wait函数可等待任意一个子进程。
:!man waitpid 之后按g到文档开头
1.如果实参是-1,那么就会和wait函数一样,等待任意一个子进程,如果是>0,就会等待和pid一样的进程ID的进程。
`status这个形参就是要解决为什么中的第3个。
那子进程返回有几种情况呢?子进程也是进程,其实就是进程退出的三种情况:
我们先看一下运行结果:
最后是256,而不是我们所想象的1,为什么呢?
core dump标志我们暂时不用管:? ?1 0000 0000? 是不是就是256了?
但是系统不需要我们知道,他提供了宏函数:
上面讲到如果子进程不退出,父进程的进程等待会一直等待,堵塞在那里,父进程什么事也做不了,所以非堵塞轮询就是解决这个问题,让父进程不仅可以等待子进程回收,也能干点自己的事情。
我们就可以写一下程序模拟一下: