守护进程

本文详细介绍了守护进程的概念及其特点,解释了守护进程与用户的关系,并提供了用C语言实现守护进程的具体代码示例。此外,还讨论了如何杀死守护进程以及创建守护进程时进行两次fork的原因。

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

守护进程
一 概念
    守护进程(daemon搜索)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾
二 守护进程的特点
    守护进程也称精灵进程,Linux系统启动时会启动很多系统服务进程,这些系统服 务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务不受用户注销登陆的影响
三 守护进程与用户之间的关系
   用户的登陆与注销与守护进程无关,不受其影响。守护进程自成进程组自成会话

四 用代码实现守护进程

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<signal.h>
  4 #include<sys/types.h>
  5 #include<sys/stat.h>
  6 #include<stdlib.h>
  7 
  8 
  9 void mydaemon()
 10 {
 11     umask(0);
 12     pid_t pid = fork();
 13     if(pid == -1)
 14         perror("fork error");
 15     else if(pid == 0)
 16     {
 17         setsid();
 18         if(chdir("/")<0 )
 19             perror("chdir error");
 20         close(0);
 21         close(1);
 22         close(2);
 23 
 24         signal(SIGCHLD,SIG_IGN);
 25     }
 26 
 27     else
 28     {
 29         exit(1);
 30     }
 31 }
 32 
 33 int main()
 34 {
 35     mydaemon();
 36     while(1);
 37     return 0;                                                                                                                                                                                                                            
 38 }
用 ps axj | grep mydaemon 来查看守护进程

五 如何杀死守护进程

可以利用kill -9 命令来杀死守护进程

六 创建守护进程为什么fork两次
  、第一次fork的作用是让shell 认为本条命令 已经终止,不用挂在终端输入上。还有一个作用是为后面setsid服务。setsid的调用者不能是进程组组长(group leader). 此时父进程是进程组组长。

2 、setsid() 是本函数最重要的一个调用。它完成了daemon函数想要做的大部分事情。调用完整个函数。子进程是会话组长(sid==pid),也是进程组组长(pgid == pid),并且脱离了原来控制终端。到了这一步,基本上不管控制终端如何怎么样。新的进程都不会收到那些信号。

3  、经过前面2个步骤,基本想要做的都做了。第2次fork不是必须的。也看到很多开源服务没有fork第二次。fork第二次主要目的是。防止进程再次打开一个控制终端。因为打开一个控制终端的前台条件是该进程必须是会话组长。再fork一次,子进程ID != sid(sid是进程父进程的sid)。所以也无法打开新的控制终端。

daemon目的就是防止终端产生的一些信号让进程退出。上面函数并没有直接调用signal函数去处理它。而是间接通过fork和setsid函数使用更少代码优雅处理。而被有些人误以为是僵死进程的原因需要这样处理。

当然,也有很多程序不是像上面函数那样去实现。而是直接通过忽略信号方式处理。这样其实也不错,因为这些信号很少会有用到的价值。直接忽略基本上不存在误杀的情况。反正达到最终目的就可以。条条大路通罗马。






  
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值