【备忘录】僵尸进程与孤儿进程以及一些进程间的知识

是这样,今天下午接到百度的面试,面试官问到僵尸进程和孤儿进程的区别,我一下子记不得了.....所以就回顾一下把这方面的东西整理一下。


僵尸进程与孤儿进程的比较

首先两者的共同点都是父进程结束后遗留下来的进程。
然后是区别
文引僵尸进程和孤儿进程的区别—Anker
—————————————引 用————————————————————

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程

————————————引 用 结 束————————————————————

显然僵尸进程危害挺大啊~所以该如何避免呢?


如何避免僵尸进程

基本上的思路都是直接或者间接的调用wait()或者waitpid()函数。

基本有以下几种:文引僵尸进程—道客巴巴

—————————————引 用—————————————————————

1、父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起 


2. 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收(没有试验过)

3. 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号

4. 还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收估计还要自己做。
 

————————————引 用 结 束————————————————————

基本上办法4是用来玩的,方法2和3是方法1的变种,感觉2和3比较靠谱。

wait()与waitpid()函数

关于wait和waitpd两个函数,我觉得有必要记下来区分一下。

wait(int * status)函数:父进程进入阻塞, 等待任意一个子进程信号传来。参数传回该子进程结束状态。

waitpid(pid_t pid, int * status, int options)函数:传入一个pid,针对该pid进行分类处理。
a)当pid<-1时,等待进程组识别码为 pid 绝对值的任何子进程。
b)当pid=-1时,等待任何子进程,相当于 wait()。
c)当pid=0时,等待进程组识别码与目前进程相同的任何子进程。
d)当pid>0时,等待任何子进程识别码为 pid 的子进程。
另一个参数options传入值为一些选项,具体的选项在man手册可以查到此处不表,不同的参数可以用‘|’连接起来。

参考文档


僵尸进程和孤儿进程的区别—Anker

僵尸进程—道客巴巴


你可能感兴趣的:(备忘录,进程与线程,进程)