Linux系统中的孤儿进程和守护进程(精灵进程)
前言
在之前的学习中我们了解到了僵尸进程的相关知识(僵尸进程博客:https://blog.****.net/Outtch_/article/details/105160491),其实在Linux系统中还有两种特殊的进程——孤儿进程和守护进程(精灵进程)。
孤儿进程和守护进程又是什么呢?它们有什么特殊的地方呢?它们怎么出现的呢?它们怎么用代码实现呢?
相信大家对这两种陌生的进程也有着许许多多的疑惑,接下来让我们一起去认识它们吧!
孤儿进程的概念
在法律层面上,孤儿是指丧失父母的未成年人。
同样的在Linux系统中的孤儿进程的概念是父进程先于子进程退出,子进程就成为了孤儿进程运行在后台
。
值得一提的是孤儿进程虽然没有了父进程,但是它会被1号init进程收养,成为init进程的子进程,子进程退出后,会由init进程对它们完成状态收集工作,所以孤儿进程并没有什么危害。
守护进程(精灵进程)的概念
普通进程都是依附于终端会话(系统与用户交流的界面)运行,当控制终端关闭时,相应的进程也被关闭。
守护进程(Deamon)其实是一种特殊的孤儿进程,守护进程脱离终端会话的影响运行在后台,它从被执行开始运转直到整个系统关闭时才退出
,守护进程通常是批处理进程(周期性的执行某项任务),守护进程又叫做精灵进程。
- 守护进程的应用场景:
应用于不想让进程受到用户或终端影响的场景下
大多数的服务器都是守护进程实现的(ssh:xshell的远程连接)
守护进程的实现
- 第一步:创建子进程,退出父进程
使子进程成为孤儿进程
,之后所有的工作都在子进程中完成,在形式上做到了与控制终端的脱离。
- 第二步:使用系统函数setsid在子进程中创建新的会话
由于子进程复制了父进程的会话、进程组、控制终端。
虽然父进程退出了,但会话、进程组、控制终端始终没有变
,因此子进程还不是真正意义上的独立。
setsid
可以让进程摆脱原会话、进程组、控制终端的控制,使进程完全独立出来。
- 第三步:改变工作目录
子进程继承了父进程的工作目录
由于在进程的运行过程中,当前目录所在的文件系统不能卸载,对以后工作会造成不便。
一般会将根目录设置为守护进程的工作目录
(chdir函数)
- 第四步:重设文件权限掩码
文件创建掩码是指屏蔽掉文件创建时的对应位
子进程继承了父进程的文件权限掩码,这就给子进程使用文件带来了诸多麻烦。
把文件权限掩码设置为0,可以大大增强守护进程的灵活性umask(0)
。
- 第五步:关闭文件描述符
子进程继承了父进程已经打开的文件,这些文件可能不会被守护进程读写,但它们一样在消耗系统资源。
守护进程已经与终端失去了联系
所以文件描述符为0、1、2
的3个文件已经失去了意义(输入 、输出、报错)因该关掉。
- 第六步:处理SIGCHLD信号
signal ( SIGCHLD , SIG_IGN ) 使父进程等待子进程退出
这样内核在子进程结束时不会产生僵尸进程
具体代码实现:
ps -ajx | grep Deamon命令查看守护进程
可见进程ID 进程组ID 会话ID都相同
进程ID为3466的进程是一个守护进程
守护进程实则就是一个普通进程按照上述步骤改造而来的
小结
到这里我们对孤儿进程和守护进程的概念以及实现已经有了一个大致的认识,在日后的学习中如果我们碰到类似的问题便能很好的解决它们。