进程(3)——进程的死亡

1.进程的诞生

我们知道了进程的诞生是通过fork(),

0进程fork出1进程

1进程fork出2进程

。。。


2.进程的死亡

进程的死亡分为:老死,自杀,他杀,

但不论哪种死亡方式,进程死后都需要归还生前的资源。

进程的资源分为两类:自己申请,父进程fork时申请,

进程死后,OS会释放进程自己申请的空间,但是无法释放父进程fork的空间,在父进程死后,OS回去释放父进程申请空间时父进程fork的空间可以被OS释放,也可以父进程主动使用wait释放。


3.wait的原理

(1)当子进程死亡后,OS会向其父进程发出SIGCHILD信号。

(2)父进程使用wait后,会被阻塞,直到收到OS的SIGCHILD信号,被唤醒的父进程会释放子进程的空间。

(3)当进程无子进程时使用wait会返回错误。

(4)wait的原型:pid_t wait(int *status);  返回pid_t ,也就是子进程的PID,参数是输出型参数,输出子进程死亡的status。

(5)status相关的宏:

WIFEXITED(status):判断子进程是否正常死亡,正常死亡:子进程自己return exit _exit。
WEXITSTATUS(status):得到子进程的返回值。

WIFSIGNALED(status):判断子进程是否非正常死亡,非正常死亡:子进程被信号杀死。


6.waitpid

(1)原型:pid_t waitpid(pid_t pid, int *status, int options);

(2)与wait的不同:可以通过pid指定子进程,可以通过options设置为非阻塞式。

(3)使用waitpid实现wait一样的功能:waitpid(-1, &status, 0); -1表示所有子进程。


7.竞态
指多个进程或线程竞争某个资源时。这种情况下哪个进程先使用资源是由OS决定的,也就是程序员无法确定的。所以程序员不希望出现竞态,所以我们需要消灭竞态。


猜你喜欢

转载自blog.csdn.net/blank2019/article/details/79672876