转载请注明作者和出处:https://blog.csdn.net/qq_28810395
运行平台: Windows 10
LeetCode官网:Fhttps://leetcode-cn.co
一、孤儿进程、僵尸进程、守护进程的概念
1.基本概念⭐⭐⭐⭐⭐
- 孤儿进程:当父进程退出后他的子进程还在运行,那么这些子进程就是孤儿进程。孤儿进程将被init进程所养,并由init进程对他们完成状态收集工作。
- 僵尸进程:当子进程退出后而父进程并未接收结束子进程(如调用waipid获取子进程的状态信息),那么子进程仍停留在系统中,这就是僵尸进程。
- 守护进程:是指在后台运行不受终端控制的进程(如输入、输出等)。网络服务大部分就是守护进程
2.如何创建守护进程⭐⭐
- 创建子进程,父进程推出:因为守护进程是在后台不受终端所控制的进程,父进程退出后控制台就以为该程序结束了,我们就可以在子进程进行自己的任务,同时用户仍可以在控制台输入指令,从而在形式上做到了与控制台脱离。
- 在子进程中创建新的会话(脱离控制终端):使用系统函数setid()来创建一个新的会话,并担任该会话组组长,摆脱原会话的控制==>摆脱原进程的控制==>摆脱原控制台的控制
- 改变当前目录为根目录:子进程继承父进程的目录信息,但进程运行时对当前目录下的文件系统不能卸载,这会有很多隐藏的麻烦,建议使用根目录作为当前目录,当然也可以使用其他目录。
- 重设文件权限掩码,关闭文件描述符:子进程还继承父进程的文件权限掩码,即屏蔽掉文件权限中的对应位。此时子进程需将其重置为0,即在此时有很大的权限,从而提高该守护进程灵活度。最后,关系从父进程继承的已经打开的文件描述符,如不进行关闭将造成浪费资源以及进程所有文件系统无法卸载等错误。
3.正确处理孤儿进程、僵尸进程的方法⭐⭐⭐⭐⭐
- 孤儿进程的处理:孤儿进程就是没有父进程的进程,它的处理就由进程为1 的Init进程负责,就像一个福利院一样,专门负责孤儿。当有孤儿进程需要处理的时候,系统就把孤儿进程的父进程设置为init,而init进程会循环的wait()它的已经退出的子进程。因此,孤儿进程不处理也不会有什么危害。
- 僵尸进程的处理:如果父进程一直不调用wait/waitpid函数接收子进程,那么子进程就一直保存在系统当中,占用系统资源,如果僵尸进程太多,那么就会导致系统空间爆满,无法创建新的进程,严重影响系统工作,为此僵尸进程需要好好处理。正确处理:系统规定,子进程退出后,父进程会自动收到SIGCHLD信号。因此我们需要父进程中重置signal函数。每当子进程退出,父进程就会收到SIGCHIL信号,故通过signal函数,重置信号响应函数。