daemon进程fork一次和fork两次区别

守护进程(Daemon)是后台运行的特殊进程,独立于控制终端并执行任务。创建守护进程通常涉及两次fork,第一次是为了使进程脱离控制终端,第二次是为了确保进程不是会话首进程,防止误操作打开终端。不进行第二次fork也是可选的,具体取决于守护进程的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

          守护进程也称为精灵进程(Daemon),是运行在后台的一种特殊的进程。它独立于控制终端并且周期性的执行某种任务负等待处理某些发生的事件。因为他们没有控制终端,所以说他们是在后台运行的。
      守护进程存在的原因:
      daemon函数存在的原因是因为控制终端由于某些原因(如断开终端连接)会发送一些信号的原因。而接受处理这些信号的缺省动作会让进程退出。这些信号会由于终端敲一些特殊按键产生。
      创建守护进程的步骤:
   (1)调用umask将文件模式创建屏蔽字设置为0;
   (2)父进程fork出子进程,然后子进程调用setsid,父进程直接退出(保证了子进程不是一个进程组的进程组长);
   (3)调用setsid创建一个新的会话(调用成功会使调用进程成为会话的首进程,并成为一个进程租的组长进程,调用进程没有控制终端);
   (4)将当前工作目录更改为根目录;
   (5)关闭不需要的文件描述符;
   (6)忽略SIGCHLD信号。
  要知道在创建守护进程的时候fork一次和fork两次的两者的区别,就要先知道第一次fork和第二次fork都起到什么作用:
    (1)调用一次fork的作用:
     第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面上的setsid服务,因为调用setsid函数的进程不能是组长进程,如果不fork出子进程,则此时的父进程是进程组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。
    (2)第二次fork的作用:
     虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。只有会话首进程能打开终端设备,也就是在fork一次,再把父进程退出,再次fork的子进程作为守护进程继续运行,保证了该精灵进程不是对话期的首进程,第二次不是必须的,是可选的,市面上有些开源项目也是fork一次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值