守护进程
守护进程常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,所以是在后台运行的,linux大部分服务器就是用守护进程实现的,守护进程的编程也不复杂,下面来说一下守护进程的特征、编程规则、出错处理等。
守护进程的特征:
1.所有守护进程都以超级用户(ID=0)的优先权运行;
2。没有一个守护进程具有控制终端—终端名称设置为问号(?)、终端前台进程组I D设置为-1。缺少控制终端可能是精灵进程调用了s e t s i d的结果。
3.除u p d a t e以外的所有精灵进程都是进程组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。u p d a t e是它所在进程组和对话期(中的唯一进程,但4是该进程组的首进程(可能也是该对话期的首进程)已经终止。
4.所有这些守护进程的父进程都是i n i t进程。
守护进程的编程规则:
1.创建子进程,父进程推出,先调用fork函数,之后使父进程exit,只对下面做的setsid调用是必要的前提条件;
2.调用setsid函数创建一个新的会话,并担任组长,形式如下:
setsid()函数格式:
#include <sys/types.h>
#include <unist.h>
Pid_t setsid(void)
函数成功时返回该进程组ID, 出错时返回-1;
3.改变当前目录为根目录 chdir(“/”);
4.重设文件权限掩码 umask(0);因为由继承得来的方式创建屏蔽字可能会拒绝设置某些许可权;
5.关闭不再需要的文件描述符,调用如下:
for(i=0;i<MAXFILE;I++)
close(i);
下面来举个例子说明一下守护进程的创建,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<fcntl.h> 5 #include<sys/types.h> 6 #include<unistd.h> 7 #include<sys/wait.h> 8 9 #define MAXFILE 65535 10 int main() 11 { 12 pid_t pc; 13 int i,fd,len; 14 char *buf="This is a Dameon\n"; 15 len =strlen(buf); 16 pc=fork(); 17 if(pc<0) 18 { 19 printf("error fork\n"); 20 exit(1); 21 } 22 else if(pc>0) 23 exit(0); 24 setsid(); 25 chdir("/"); 26 umask(0); 27 for(i=0;i<MAXFILE;i++) 28 close(i); 29 while(1) 30 { 31 if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0) 32 { 33 perror("open"); 34 exit(1); 35 } 36 write(fd, buf, len+1); 37 close(fd); 38 sleep(10); 39 } 40 }
守护进程的出错处理:
由于守护进程完全脱离了控制终端,因此,不能像其它程序一样通过输出错误到控制台的方式来通知程序员,一般使用syslog服务,将出错信息输入到“/var/log/message”系统日志文件中,Syslog是Linux中的系统日志管理服务,通过守护进程stslog来维护,还是举个例子来说明,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<fcntl.h> 5 #include<sys/types.h> 6 #include<unistd.h> 7 #include<sys/wait.h> 8 #include<syslog.h> 9 10 #define MAXFILE 65535 11 int main() 12 { 13 pid_t pc,sid; 14 int i,fd,len; 15 char *buf="This is a Dameon\n"; 16 len =strlen(buf); 17 pc=fork(); 18 if(pc<0) 19 { 20 printf("error fork\n"); 21 exit(1); 22 } 23 else if(pc>0) 24 exit(0); 25 openlog("demo_update",LOG_PID, LOG_DAEMON); 26 if((sid=setsid())<0) 27 { 28 syslog(LOG_ERR, "%s\n", "setsid"); 29 exit(1); 30 } 31 if((sid=chdir("/"))<0) 32 { 33 syslog(LOG_ERR, "%s\n", "chdir"); 34 exit(1); 35 } 36 umask(0); 37 for(i=0;i<MAXFILE;i++) 38 close(i); 39 while(1) 40 { 41 if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND, 0600))<0) 42 { 43 syslog(LOG_ERR, "open"); 44 exit(1); 45 } 46 write(fd, buf, len+1); 47 close(fd); 48 sleep(10); 49 } 50 closelog(); 51 exit(0); 52 }