您的位置:首页 > 运维架构 > Linux

Linux学习笔记之守护进程

2016-07-20 20:30 267 查看
在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。

那么如何创建一个守护进程呢?

1. 调用umask将⽂文件模式创建屏蔽字设置为0。

很多情况下,守护进程会创建一些临时文件。出于安全性的考虑,往往 不希望这些文件被别的用户查看。所以使用umask函数修改文件权限,以满足守护进程的要求。

2. 调⽤fork,让父进程退出(exit)。

这样做的好处:1)如果守护进程是一个简单的shell命令启动的,那么父进程的终止可以使shell认为这个命令已经执行结束了。2)子进程继承了父进程的组ID,但又有自己的进程ID,所以我们可以保证目前的子进程不是进程组长。这一步也是我们接下来要用到的setsid函数之前的必要条件。

3. 调⽤用setsid创建一个新会话。

setsid会导致:1)调用进程成为新会话的首进程。 2)调用进程成为 一个进程组的组长进程 。3)调⽤用进程没有控制终端。

4. 将当前工作⽬目录更改为根⽬目录。

5. 关闭不在需要的⽂文件描述符。

6. 其他:忽略SIGCHLD信号。





可以看到my_daemon作为一个守护进程在运行了。

看到好多人建议在setsid()之后再fork()一次,依旧是父进程退出,子进程担当守护进程的角色,这样做是防止进程再次打开一个控制终端。因为打开一个控制终端的前台条件是该进程必须是会话组长。再fork一次,子进程ID != sid(sid是父进程的sid)。所以也无法打开新的控制终端。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息