守护进程
守护进程也叫精灵进程(Daemon),它在后台运行,独立于控制终端并周期性地执行某种任务或等待某些事情发生,一般用于C/S 服务中,在服务端监听端口,等待客户端的连接,如果有客户端发出连接,则fork出一个子进程去响应,而守护进程继续监听。
步骤
创建一个守护进程一般有如下几步:
- 调用
umask(0)
,将文件模式创建屏蔽字改为0 - 调用
fork()
,父进程退出,目的是:
- 父进程终止可以让shell切换到前台继续等待用户输入命令
- 保证子进程不是一个进程组的组长进程
- 在子进程中调用
ssetsid()
,会导致如下结果:
- 调用进程成为新会话的首进程
- 调用进程成为一个进程组的组长进程
- 调用进程脱离终端,即没有控制终端
- 调用
chdir("/")
将当前工作目录更改为根目录,目的是防止用户改动目录,从而影响进程的运行 - 关闭相应的文件描述符,原因是,当前进程已经脱离终端,防止产生并不需要的交互作用,还有一个原因,用fork新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,所以需要关闭
- 忽略SIGCHLD信号,该动作是为了,子进程退出的时候资源能够被系统所回收,防止出现僵尸进程