1>概念
守护进程,也就是通常所说的Daemon进程,
是linux中的后台服务进程
它是一个生存期较长(长生)的进程,在系统引导装入时启动,在系统关闭时终止。
不受终端控制
并且周期性的执行某种任务或等待处理某些事件
linux系统有很多守护进程,大多数服务都是用守护进程实现的。
2>相关概念
1>终端
在linux中,每一个系统和用户进行交流的界面叫终端或会话
2>控制终端
每一个从此终端开启的进程都会依附与这个终端,这个终端就被称为这些进程的
控制终端,当这个终端被关闭时,相应的进程也会自动关闭
守护进程可以突破这种限制,它被执行开始运行,直到整个系统被关闭才会退出
如果想让某个进程不因为用户或终端或其他变化而受影响,就必须把这个进程变成一个守护进程。
没有终端--->没有输入输出
后台进程--->默默执行
守护进程的创建:
1>创建子进程2,结束父进程1 (为会话做准备)
--->进程组的组长不具备设置会话的能力
if(fork()!=0)
exit(0);
2>设置当前子进程为一个会话 (摆脱原终端的影响)
if(setsid()<0)
{
perror("setsid error");
exit(1);
}
3>创建子进程3,结束父进程2
--->让子进程3不具备打开终端的能力
if(fork()!=0)
exit(0);
4>关闭所有文件描述符
--->节省资源
int i;
for(i=0;i<sysconf(_SC_OPEN_MAX);i++)
close(i);
5>改变执行目录
--->将执行目录换到 根目录 下
chdir("/");
6>修改掩码
--->将掩码修改为0
默认为0002
umask(0);
7>标准输入、标准输出、标准错误输出全部重定向到null
--->将0 1 2 重定向到 设备:null
int fd=open("/dev/null",O_RDWR);
dup(0);
dup(0);
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
void daemon_init(void);
int main(){
//守护进程
daemon_init();
//打开日志系统
openlog("刀郎",LOG_PID,LOG_DAEMON);
//以读写的方式打开打开xx.txt文件
int fd=open("xx.txt",O_RDWR|O_TRUNC);
if(fd<0){
syslog(LOG_ERR,"刀郎 open error"); //因为标准出错的文件描述符指向NULL,所以无法使用perror
exit(-1);
}
char buf[20]="huaqingdaolang\n"; //声明一个空间,空间共大小20字节,里面有huaqingdaolang\n
while(1){ //循环
sleep(1); //一秒执行一次下面的代码
write(fd,buf,strlen(buf)); //写操作,往fd里写buf的内容
syslog(LOG_INFO,"%s",buf); //写入日志,往日志里写buf的内容
}
closelog(); //关闭日志
close(fd); //关闭fd
return 0;
}
void daemon_init(void){
//1>创建子进程2,结束父进程1 (为会话做准备)--->进程组的组长不具备设置会话的能力
if(fork()!=0)
exit(0);
//2>设置当前子进程为一个会话 (摆脱原终端的影响)
if(setsid()<0){
perror("setsid error");
exit(-1);
}
//3>创建子进程3,结束父进程2--->让子进程3不具备打开终端的能力
if(fork()!=0)
exit(0);
//4>关闭所有文件描述符--->节省资源
int i;
for(i=0;i<=sysconf(_SC_OPEN_MAX);i++)
close(i);
//5>改变执行目录--->将执行目录换到 根目录 下
chdir("/");
//6>修改掩码--->将掩码修改为0 默认为0002
umask(0);
//7>标准输入、标准输出、标准错误输出全部重定向到null--->将0 1 2 重定向到 设备:null
int fd=open("/dev/null",O_RDWR);
dup(0);//0--fd,产生1
dup(0);//0--fd,产生2
}