您的位置:首页 > 其它

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

2018-03-23 21:39 162 查看
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决定的,也就是程序员无法确定的。所以程序员不希望出现竞态,所以我们需要消灭竞态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: