守护进程也称为精灵进程(Daemon),是运行在后台的一种特殊的进程。它独立于控制终端并且周期性的执行某种任务负等待处理某些发生的事件。因为他们没有控制终端,所以说他们是在后台运行的。
守护进程存在的原因:
daemon函数存在的原因是因为控制终端由于某些原因(如断开终端连接)会发送一些信号的原因。而接受处理这些信号的缺省动作会让进程退出。这些信号会由于终端敲一些特殊按键产生。
创建守护进程的步骤:
(1)调用umask将文件模式创建屏蔽字设置为0;
(2)父进程fork出子进程,然后子进程调用setsid,父进程直接退出(保证了子进程不是一个进程组的进程组长);
(3)调用setsid创建一个新的会话(调用成功会使调用进程成为会话的首进程,并成为一个进程租的组长进程,调用进程没有控制终端);
(4)将当前工作目录更改为根目录;
(5)关闭不需要的文件描述符;
(6)忽略SIGCHLD信号。
要知道在创建守护进程的时候fork一次和fork两次的两者的区别,就要先知道第一次fork和第二次fork都起到什么作用:
(1)调用一次fork的作用:
第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面上的setsid服务,因为调用setsid函数的进程不能是组长进程,如果不fork出子进程,则此时的父进程是进程组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。
(2)第二次fork的作用:
虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。只有会话首进程能打开终端设备,也就是在fork一次,再把父进程退出,再次fork的子进程作为守护进程继续运行,保证了该精灵进程不是对话期的首进程,第二次不是必须的,是可选的,市面上有些开源项目也是fork一次。
守护进程存在的原因:
daemon函数存在的原因是因为控制终端由于某些原因(如断开终端连接)会发送一些信号的原因。而接受处理这些信号的缺省动作会让进程退出。这些信号会由于终端敲一些特殊按键产生。
创建守护进程的步骤:
(1)调用umask将文件模式创建屏蔽字设置为0;
(2)父进程fork出子进程,然后子进程调用setsid,父进程直接退出(保证了子进程不是一个进程组的进程组长);
(3)调用setsid创建一个新的会话(调用成功会使调用进程成为会话的首进程,并成为一个进程租的组长进程,调用进程没有控制终端);
(4)将当前工作目录更改为根目录;
(5)关闭不需要的文件描述符;
(6)忽略SIGCHLD信号。
要知道在创建守护进程的时候fork一次和fork两次的两者的区别,就要先知道第一次fork和第二次fork都起到什么作用:
(1)调用一次fork的作用:
第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面上的setsid服务,因为调用setsid函数的进程不能是组长进程,如果不fork出子进程,则此时的父进程是进程组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。
(2)第二次fork的作用:
虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。只有会话首进程能打开终端设备,也就是在fork一次,再把父进程退出,再次fork的子进程作为守护进程继续运行,保证了该精灵进程不是对话期的首进程,第二次不是必须的,是可选的,市面上有些开源项目也是fork一次。