在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程。为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定的方式配置系统。 守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。
守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的意思)。
创建守护进程
1.创建子进程,父进程退出
2.在子进程中创建新会话
3.改变当前目录为根目录
4.重设文件权限掩码
5.关闭文件描述符
用fork函数新建的子进程会从 父进程 那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗 系统资源 ,而且可能导致所在的文件系统无法卸下。#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char const *argv[])
{
pid_t pid;
pid = fork();
if(-1 == pid){
perror("fork");
exit(-1);
}
if(pid > 0){
exit(0);
}else{
if(-1 == setsid()){
perror("setsid");
}
pid = fork();
if(-1 == pid){
perror("fork");
exit(-1);
}
if(pid>0){
exit(0);
}else{
int i,max_fd;
if(-1 == chdir("/tmp")){
perror("chdir");
exit(-1);
}
umask(0);
max_fd=getdtablesize();
for(i=0;i<max_fd;i++){
close(i);
}
while(1){
//添加你需要执行的代码
}
}
}
return 0;
}
守护进程出错处理:
由于守护进程完全脱离了控制终端,所以不能通过终端查看守护进程的运行情况,
通常是使用syslog服务,将出错信息输入到"/var/log/message"系统日志文件中去
Syslog是linux中的系统日志管理服务,通过守护进程syslog来维护
syslog函数:
Openlog ---打开连接
Syslog ---写入消息
Closelog---关闭连接
Example: syslog_dameon.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<syslog.h>
#define MAXFILE 65535
int main()
{
pid_t pc,sid;
int i,fd,len;
char *buf="This is a Dameon\n";
len =strlen(buf);
pc=fork();
if(pc<0)
{
printf("error fork\n");
exit(1);
}
else if(pc>0)
{
exit(0);
}
openlog("demo_update",LOG_PID, LOG_DAEMON);
if((sid=setsid())<0)
{
syslog(LOG_ERR, "%s\n", "setsid");
exit(1);
}
if((sid=chdir("/"))<0)
{
syslog(LOG_ERR, "%s\n", "chdir");
exit(1);
}
umask(0);
for(i=0;i<MAXFILE;i++)
close(i);
while(1)
{
if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND, 0600))<0)
{
syslog(LOG_ERR, "open");
exit(1);
}
write(fd, buf, len+1);
close(fd);
sleep(10);
}
closelog();
exit(0);
}