1、什么是守护进程
1.守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通 常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件
2.守护进程常常在系统启动时开始运行,在系统关闭时终止
3.Linux系统有很多守护进程,大多数服务都是用守护进程实现的
2、守护进程有什么用,为什么使用守护进程?
解决交互进程存在的弊端 在Linux中,每一个系统与用户进行交流的界面称为终端。
从该终端开始运行的进程都会依附于这个终端,这个终端称为这些进程的控制终端。
当控制终端被关闭时,相应的进程都会被自动关闭。 守护进程能够突破这种限制,它从开始运行,直到整个系统关闭才会退出。
如果想让某个进程不会因为用户或 终端的变化而受到影响,就必须把这个进程变成一个守护进程。
3、创建守护进程的步骤
1. 创建子进程,父进程退出 --- 目的就是让子进程变成后台程序
2. 在子进程中创建新会话 :
setsid函数用于创建一个新的会话,并使得当前进程成为新会话组的组长
setsid函数能够使进程完全独立出来,从而脱离所有其他进程的控制。
#include <sys/types.h>
#include <unistd.h>
pid_t setsid(void);
3.改变当前目录为根目录 :
通常的做法是让“/”或”/tmp”作为守护进程的当前工作目录 。
在进程运行过程中,当前目录所在的文件系统是不能卸载的。
chdir函数可以改变进程当前工作目录
4. 重设文件权限掩码
文件权限掩码是指文件权限中被屏蔽掉的对应位。把文件权限掩码设置为0,可以增加该守护进程的灵活
性。
设置文件权限掩码的函数是umask
通常的使用方法为umask(0)
5. 关闭文件描述符
新建的子进程会从父进程那里继承所有已经打开的文件。
在创建完新的会话后,守护进程已经脱离任何控制终端,应当关闭用不到的文件
fdtablesize = getdtablesize();
for (fd = 0; fd < fdtablesize; fd++){ close(fd);}
6. 守护进程的任务(如写日志等)
4、守护进程的具体实现
创建一个守护进程,每隔5s把当前的系统时间 输出到 一个 time.txt文本中
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
int main()
{
pid_t pid =0;
pid = fork();
if(pid<0)
{
perror("fork error");
return -1;
}
else if(pid >0)//父进程
{
exit(0);
}
else if(pid ==0) //子进程
{
pid_t res = setsid(); //创建会话
if(res <0)
{
perror("setsid error");
return -1;
}
//改变当前目录
int ret = chdir("/tmp");
if(ret<0)
{
perror("chdir error");
return -1;
}
//设置掩码
umask(0);
int i=0;
//关闭文件描述符
for(i= 0; i<getdtablesize(); i++)
{
close(i);
}
//守护进程开始做业务
while(1)
{
system("echo `date` >> time.txt");
sleep(5);
}
}
return 0;
}
运行结果,如下图所示: