守护进程

守护进程也称精灵进程( Daemon),是运行在后台的⼀一种特殊进程。它独立于控制终端并 且周期性地执行某种任务或等待处理某些发生的事件。守护进程是⼀一种很有用的进程。 Linux的⼤大多数服务器就是⽤用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd 等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等 Linux系统启动时会启动很多系统服务进程,这些系统服 务进程没有控制终端,不能直接和用 户交互。其它进程都是在⽤用户登录或运⾏行程序时创建,在运行结束或⽤用户注销时终止,但系统 服务进程不受⽤用户登录注销的影响,它们⼀一直在运行着。这种进程有⼀一个名称叫守护进程 (Daemon)。
守护进程自己就是一个会话
这里写图片描述
创建守护进程:
1、先使用umask将文件模式屏蔽字设置为0
2、调用fork,父进程退出(exit)。原因:1)如果该守护进程是作为⼀一条简单的shell命令 启动的,那么父进程终止使得shell认为该命令已经执行完毕。2)保证子进程不是一个进程组的组长进程。
3、 调⽤用setsid创建一个新会话。setsid会导致:1)调用进程成为新会话的首进程。 2)调用 进程成为⼀一个进程组的组长进程 。3)调⽤用进程没有控制终端。(再次fork一次,保证 daemon进程,之后不会打开tty设备)
4. 将当前⼯工作⽬目录更改为根⽬目录。 5. 关闭不在需要的⽂文件描述符。 6. 其他:忽略SIGCHLD信号。


#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
void mydaemon()
{
       umask(0);
       if(fork() >0)
       {

           exit(0);
       }
       else if(fork()<0)
       {

           return ;
       }
          setsid();
         chdir("/");
         close(0);
         close(1);
         close(2);
         signal(SIGCHLD,SIG_IGN);

}
int  main()
{
        mydaemon();

         while(1)
         {

         }

         return 0; 
}

这里写图片描述
为什么创建守护进程要fork两次?
虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。
只有会话首进程能打开终端设备,也就是再fork一次,再把父进程退出,再次fork的子进程作为守护进程继续运行,保证了该精灵进程不是对话期的首进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值