守护进程的模拟实现(daemon)

一、什么是守护进程

守护进程也称为精灵进程(Daemon),是运行在后台的一种特殊进程。他独立与控制终端并且周期性的执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。
Linux的大多数服务器就是用守护进程实现的 比如:Internet服务器 inetd,Web服务器httpd等同时守护进程完成许多系统任务。比如:作业规划进程crond等。
Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能和用户直接交互,其他进程都是在用户登录或运行程序时创建的,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,他们一直在运行着,这种进程有一个名称叫守护进程(Daemon)

二、守护进程有哪些特点

  1. 守护进程的PPID为1(init)
  2. 所有守护进程自称会话(PID PGID SID(会话ID)基本都一样)
  3. 守护进程自成一派互不影响,不受用户登录与终端关闭的影响。
  4. 守护进程都为孤儿进程,他们的父进程为1(init)
  5. 是运行在后台的一种特殊进程
  6. 凡是TPGID一栏写着 -1 的都是没有控制终端的进程,也就是守护进程

守护进程的模拟实现(daemon)_第1张图片
7.COMMAND一列用 [] 括起来的,名字表示内核线程

三、守护进程的模拟实现

创建守护进程最关键的一步是调用setsid()函数创建一个新的Session(会话),并且为Session Leader
头文件:

#include
pid_t setsid(void);

守护进程的模拟实现(daemon)_第2张图片

1、守护进程模拟实现代码块

  1 #include.h>
  2 #include.h>
  3 #include.h>//信号头文件                                                          
  4 void mydaemon()
  5 {
  6    umask(0);//1、将文件模式创建屏蔽字设置为0

  7    if(fork() > 0)
  8    {//father
  //2、调用fork(),然后让父进程退出(exit(0);)  原因1)如果该守护进   程是作为一条简单的shell命令启动的,那么父进程终止使得shell认为该命令已  经执行完毕。2)保证子进程不是一个进程组的组长进程
  9      exit(0);
 10    }

      //child
 11    setsid();//3、创建一个新会话。setsid会导致:1)调用进程会成为新会话的首进程。 2)调用进程成为一个进程组的组长进程 3)调用进程没有控制终端 (再次fork(),保证daemon进程,之后不会打开tty设备)

 12    chdir("/");//4、将当前工作目录更改为根目录
 13    close(0);//5、关闭不再需要的文件描述符
 14    close(1);
 15    close(2);
 16    signal(SIGCHLD,SIG_IGN);//6、忽略SIGCHLD(子进程信号)信号
 17 }
 18 
 19 int main()
 20 {
 21     mydaemon();
 22     while(1);
 23     return 0;
}

2、Makefile文件

  1 mydaemon : mydaemon.c
  2     gcc -o $@ $^ -g -lpthread
  3 .PHONY:clean
  4 clean:                                                                      
  5     rm -f mydaemon

3、运行结果

这里写图片描述
守护进程的模拟实现(daemon)_第3张图片

四、创建守护进程的专用函数

int daemon(int nochdir, int noclose);
//也可以用该函数创建一个守护进程

守护进程的模拟实现(daemon)_第4张图片
守护进程的模拟实现(daemon)_第5张图片

你可能感兴趣的:(Linux系统编程)