守护进程,也就是通常所说的Daemon进程(又称精灵进程),是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,如作业规划进程crond、打印进程lqd等。
在Linux终端执行进程时,当终端被关闭时,相应的进程都会自动关闭。但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才会退出。如果想让某个进程不因为用户、终端、或其他的变化而受到影响,那么就必须把这个进程变成一个守护进程。
(1)守护进程的编写步骤
① 创建子进程,父进程退出
首先调用fork,然后使父进程调用exit函数退出,这一步给Shell进程造成程序运行完成的假象,让Shell进程把自己提到会话前台,此时用户在Shell终端里可以执行其他命令,从而让程序形式上脱离了控制终端。
由于父进程已经先于子进程退出,会造成子进程没有父进程,此时子进程变成一个孤儿进程。在Linux中,每当系统发现一个孤儿进程,就会自动由1号进程(init进程)收养它,这样,子进程就会成了init进程的子进程。
② 调用setsid创建一个新会话
在第1步调用fork函数后,子进程几乎是父进程的副本,虽然父进程退出了,但会话ID、进程组ID等并没有改变,因此,还不是真正意义上脱离控制终端,而setsid函数能够使进程完全独立出来。
调用setsid函数后,该子进程成为新会话的首进程,成为一个新进程组的首进程而且没有控制终端。