进程等待-wait和waitpid

发布时间:2024年01月14日

目录

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/非堵塞轮询

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

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

文章来源:https://blog.csdn.net/Qianxueban/article/details/135550477
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。