标签:守护进程、精灵进程
1、什么是守护进程
守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着。这种进程有一个名称叫守护进程(Daemon)。
2、如何创建守护进程
1)使用setsid函数
使用该函数的前提条件是当前进程不允许是进程组的组长,否则该函数返回-1。可以使用fork函数来解决此问题。
2)成功调用该函数的结果是:
1. 创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id。
2. 创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id。
3. 如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。所谓失去控制终端是指,原来的控制终端仍然是打开的,仍然可以读写,但只是一个普通的打开文件而不是控制终端了。
3)创建步骤
(1)调用umask将文件模式创建屏蔽字设置为0.
(2)调用fork,父进程退出(exit)。守护进程是孤儿进程。
原因:1)如果该守护进程是作为条简单的shell命令启动的,那么父进程终止使得shell认为该命令已经执行完毕。2)保证子进程不是一个进程组的组长进程。
(3)调用setsid创建个新会话。
setsid会导致:1)调用进程成为新会话的首进程。 2)调用进程成为一个进程组的组长进程 。3)调用进程没有控制终端。
(4)将当前工作目录更改为根目录。
(5)关闭不在需要的文件描述符。
(6)其他:忽略SIGCHLD信号。
4)代码实现
3、有时候创建守护进程时为什么会fork两次,第二次的作用?
第一次fork的作用是让shell认为本条命令已经终止,不用挂在终端输入上。还有一个作用是为后面setsid服务。setsid的调用者不能是进程组组长(group leader),此时父进程是进程组组长。
第二次fork不是必须的。
fork第二次主要目的是:防止进程再次打开一个控制终端。因为打开一个控制终端的前台条件是该进程必须是会话组长。再fork一次,子进程ID != sid(sid是进程父进程的sid)。所以也无法打开新的控制终端。
本文出自 “LOVEMERIGHT” 博客,请务必保留此出处http://lovemeright.blog.51cto.com/10808587/1827949
标签:守护进程、精灵进程
原文地址:http://lovemeright.blog.51cto.com/10808587/1827949