一、守护进程定义
守护进程也称精灵进程( Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。 Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd 等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等。
二、守护进程的创建方法
1.调用umask将文件模式创建屏蔽字设置为0
2.创建子进程,父进程退出
由于守护进程是脱离控制终端的,因此,完成这一步后就会在Shell终端里造成一程序已经运行完毕的假象。之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到了与控制终端的脱离。
在Linux中父进程先于子进程退出会造成子进程成为孤儿进程,而每当系统发现一个孤儿进程时,就会自动由1号进程(init)收养它,这样,原先的子进程就会变成init进程的子进程。
3.在子进程中创建新会话
这个步骤是创建守护进程中最重要的一步,虽然它的实现非常简单,但它的意义却非常重大。使用的是系统函数setsid。
该函数调用成功时返回新创建的Session的id(其实也就是当前进程的id),出错返回-1。注意,调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。所以第一步先创建子进程,fork创建的子进程和父进程在同一个进程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子 程中调用setsid就不会有问题了。
成功调用该函数的结果是:
(1)创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id。
(2)创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组id。
(3)如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进 程。所谓失去控制终端是指,原来的控制终端仍然是打开的,仍然可以读写,但只是一个普 通的打开文件而不是控制终端了。
4. 将当前工作目录更改为根目录。
5. 关闭不在需要的文件描述符。
6. 其他:忽略SIGCHLD信号。
三、守护进程代码实现
四、fork一次和两次的区别
在创建守护进程时,创建子进程可以fork一次,也可以fork两次。
第一次fork完成后,就会在Shell终端里造成一程序已经运行完毕的假象。之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到了与控制终端的脱离。
第二次fork是为了防止后期可能会误操作打开了终端。由于只有会话首进程能打开终端设备,所以再次fork,fork创建的子进程和父进程在同一个进程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程。在子进程中调用setsid就没有问题了。
原文地址:http://11451519.blog.51cto.com/11441519/1829088