守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。
守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。
Linux 的大多数服务器就是用守护进程实现的。比如,Internet 服务器 inetd,Web 服务器 httpd 等。
- 创建子进程,父进程退出(必须)
所有工作在子进程中进行形式上脱离了控制终端 - 在子进程中创建新会话(必须)
setsid()函数
使子进程完全独立出来,脱离控制 - 改变当前目录为根目录(不是必须)
chdir()函数
防止占用可卸载的文件系统
也可以换成其它路径 - 重设文件权限掩码(不是必须)
umask()函数
防止继承的文件创建屏蔽字拒绝某些权限
增加守护进程灵活性 - 关闭文件描述符(不是必须)
继承的打开文件不会用到,浪费系统资源,无法卸载 - 开始执行守护进程核心工作(必须)
守护进程退出处理程序模型
umask:0002
创建文件权限:664(0666 & ~0002 = 0664)
创建目录权限:775 (0777 & ~0002 = 0775)
默认情况下umask为0002,也就是说:touch txt,然后ls -l txt,会显示:-rw-rw-r–(664)。若创建目录:mkdir txt,然后:ls -l txt,则显示drwxrwxr-x(775)
若在终端输入umask 0,那么上述创建文件和目录则会是666,777!
#include#include #include #include #include #include int main() { int ret=-1; pid_t pid = -1; //1.创建子进程 父进程退出 pid = fork(); if(-1 == pid) { perror("fork"); return 1; } if(pid > 0) { //父进程退出 exit(0);//子进程成为孤儿进程,被1号进程(终端界面的话就是1号进程)收养,子进程不占用控制终端 } //2.创建新的会话,完全脱离控制终端 pid = setsid();//终端关了,也不会受影响 if(-1 == pid) { perror("setsid"); return 1; } //3.改变当前工作目录 ret = chdir("/"); if(-1 == ret) { perror("chdir"); return 1; } //4.设置权限掩码 umask(0);//不屏蔽任何权限 //5.关闭文件描述符 close(STDIN_FILENO);//stdin-->FILE* close(STDOUT_FILENO); close(STDERR_FILENO); //6.执行核心的任务 //每隔一秒钟输出当前的时间到/tmp/txt.log文件中 while(1) { system("date >> /tmp/txt.log");//重定向,date是个命令,将时间打印在txt文件中 sleep(1); } return 0; }
动态的查看txt文件变化



