Linux--守护进程,为什么要fork两次

守护进程 

守护进程也称为精灵进程,Linux 下server都是守护进程。

守护进程特点如下:

  (1)其父进程是1号进程

  (2)在后台运行,独立于终端,周期性的以某种任务或等待处理某些发生的事

  (3)自成进程组,自成会话,不受登陆注销等影响

  (4)一般是孤儿进程

因为他们不受用户登录和注销的影响,一直运行着,因此给他们取了一个名字叫做守护进程(精灵进程)。  

查看系统中进程命令

ps axj | grep head

参数a不仅列出当前用户的进程,也列出其他用户的进程; 
参数x表示不仅列出有控制终端的进程,也列出其他没有控制终端的进程; 
参数j列出与作业控制相关的信息。 
创建守护进程调用的函数

#include <unistd.h>
pid_t setsid(void);

该函数调用成功时返回新创建的进程的id,出错返回-1。 
调用次函数条件: 
1.调用umask将文件屏蔽字设置为0; 
2.当前进程不允许是进程组的组长,当前进程的id就是进程的id。因此在调用之前必须调用fork。然后退出父进程。 
3.调用setsid创建一个新会话。 
4.将当前工作目录改为根目录。 
5.关闭不需要的文件描述符。 
6.忽略SIGCHILD信号。 
我们很容易写出以下代码:



为什么fork两次?

1 、第一次fork的作用是让shell 认为本条命令 已经终止,不用挂在终端输入上。还有一个作用是为后面setsid服务。setsid的调用者不能是进程组组长(group leader). 此时父进程是进程组组长。 
2 、setsid() 是本函数最重要的一个调用。它完成了daemon函数想要做的大部分事情。调用完整个函数。子进程是会话组长(sid==pid),也是进程组组长(pgid == pid),并且脱离了原来控制终端。到了这一步,基本上不管控制终端如何怎么样。新的进程都不会收到那些信号。 
3 、经过前面2个步骤,基本想要做的都做了。第2次fork不是必须的。也看到很多开源服务没有fork第二次。fork第二次主要目的是。防止进程再次打开一个控制终端。因为打开一个控制终端的前台条件是该进程必须是会话组长。再fork一次,子进程ID != sid(sid是进程父进程的sid)。所以也无法打开新的控制终端。 
因此我们的代码可以改写为:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值