一.守护进程(Daemon)
1.关于守护进程
守护进程,顾名思义,也就是专门守护一个进程的进程。守护进程的职责就是专门确保被指定的进程的运行。
守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端,并且周期性的执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程,linux的大多数服务器就是用守护进程实现的。比如:Internet服务器inetd。Wed服务器httpd等。同时,守护进程完成了许多系统任务。比如,作业规划进程crond等。
linux系统启动时会启动很多系统服务进程,这些服务进程没有控制终端,不能和用户交互。其他进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但是系统服务进程不受用户登录注销的影响,他们一直在运行着。这种进程的名称叫做守护进程。
最直接的应用就是重启进程。如果我们的软件崩溃了,为了让软件重新运行起来,软件本身是无法不方便或者无法做到的。因为出故障就是软件本身,而这个故障严重到迫使软件本身挂掉了,自然也没有办法重启自己了。
那么可以借助一个专门的进程来帮助自己启动咯。守护进程当然不仅限于重启进程咯。要实现什么守护功能,就看你怎么实现了。你可以守护进程不被关闭,重启进程,也可以守护进程的网络,必要的配置文件等等。
守护进程好比是保镖,被守护的进程就是保镖保护的对象。守护进程在很多地方都会有应用
二.创建守护进程
1. 关于setsid函数
创建守护进程最关键一步是调用setsid函数创建一个新的Session,并成为Session Leader。
#include<unistd.h>
pid_t setsid(void);
该函数调用成功时返回新创建的Session的id(其实也就是当前进程的id),出错返回-1。注意:调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。要保证当前进程不是进程组的Leader很容易,只要先fork再调用setsid就行了。fork的子进程和父进程在同一个进程组中,进程组的Leader必然是该进程组的第一个进程,所以子进程不可能是该组的第一个进程,所以在子进程中调用setsid是一定不会有问题的。