守护进程以及fork两次的问题

守护进程?
守护进程也称“精灵进程”,一般而言,守护进程7*24h运行着,它不受用户登录与注销的影响。Linux中的很多系统服务进程就是守护进程。

如何识别守护进程?
凡是TPGID为-1的进程都是守护进程,通常守护进程的命名以”d”结尾,表示daemon。守护进程以及fork两次的问题

守护进程的特点
(1)独立于控制终端。
控制终端可以给进程发送信号,而这些信号可能会导致进程退出,这就使得进程不能正常的处理某些任务,特别是系统任务。所以就需要让进程独立于控制终端去执行某些任务或处理某些事件。
(2)守护进程是孤儿进程。
因为守护进程的父进程是1号进程init。
(3)守护进程自成会话,且是会话的话首进程。
这要求调用setsid()创建会话的进程不能为进程组的组长进程即进程组中的第一个进程,所以当前进程要先fork()创建出子进程再调用setsid()。
(4)守护进程自成进程组,且是进程组的组长进程。
(5)守护进程不受用户登录和注销的影响。
守护进程独立于控制终端,不能直接和用户交互。

如何创建守护进程?
(1)调用umask()将权限设置为0;
(2)调用fork()创建子进程,父进程退出;
(3)调用setsid()创建新会话;
(4)调用chdir()将当前工作目录更改为根目录;
(5)关闭不再需要的文件描述符;
(6)忽略SIGCHLD信号,以防止出现僵尸进程。

守护进程的实现
守护进程以及fork两次的问题

守护进程以及fork两次的问题

可以看到PID=PGID=SID

守护进程的两次fork()
守护进程以及fork两次的问题

守护进程的两次fork()实现
守护进程以及fork两次的问题

守护进程以及fork两次的问题