4.出错处理

由于守护进程完全脱离了终端,因此不能只是写到标准出错上。通常使用的方法是使用syslog服务,将出错信息输入到”/var/log/message”系统日志文件中去。Syslog是Linux中的系统日志管理服务,通过守护进程syslog来维护。

处理过程

<1>打开syslog

<2>写入日志

<3>关闭syslog

 

头文件

#include <syslog.h>

函数原型:

void openlog(char *ident, int option, int facility) ;

参数:

ident为自定义标识符,

option如下

LOG_CONS

若日志消息,不能通过U N I X域数据报发送至s y s l o g d,则将该消息写至控制台

LOG_NDELAY1

立即打开U N I X域数据报套接口至s y s l s g d精灵进程—不要等到记录第一条消息。

通常,在记录第一条消息之前,该套接口不打开

L O G_ P E R R O R

除将日志消息发送给s y s l o g外,还将它写至标准出错。

L O G _ P I D

每条消息都包含进程I D此选择项可供对每个请求都f o r k一个子进程的精灵进程使用

 

facility

设置f a c i l i t y参数的目的是让配置文件可以说明,来自不同设施的消息以不同的方式进行处理

 

LOG_A U T H 授权程序: l o g i n . s u , g e t t y ,⋯

LOG_C R O N   c r o n和a t

LOG_D A E M O N 系统精灵进程:f t p d , r o u t e d ,⋯

LOG_K E R N 内核产生的消息

LOG_L O C A L 0 保留由本地使用

LOG_L O C A L 1 保留由本地使用

LOG_L O C A L 2 保留由本地使用

LOG_L O C A L 3 保留由本地使用

LOG_LO C A L 4 保留由本地使用

LOG_LOCAL5 保留由本地使用

LOG_LOCAL6 保留由本地使用

LOG _LOCAL7 保留由本地使用

LOG _L P R  行打系统:lpd, lpc, ⋯

LOG_ M A I L   邮件系统

LOG_ N E W S U   s e n e t网络新闻系统

L O G_ S Y S L O G   s y s l o g d精灵进程本身

L O G _U S E R     来自其他用户进程的消息

L O G _U U C P     U U C P系统

 

void syslog(int priority, char * format, ...);

参数:类似于printf(),只是将输出换成了系统日志

priority参数是f a c i l i t y和l e v e l的组合

l e v e l:

L O G _E M E R G 紧急(系统不可使用) (最高优先级)

L O G _A L E R T 必须立即修复的条件

L O G _C R I T 临界条件(例如,硬设备出错)

L O G _E R R 出错条件

L O G _W A R N I N G 警告条件

L O G _N O T I C E 正常,但重要的条件

L O G _I N F O 信息性消息

L O G _D E B U G 调试排错消息(最低优先级)

举例

 
  
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include<sys/types.h>  
  4. #include<sys/stat.h>  
  5. #include<signal.h>  
  6. #include<fcntl.h>  
  7. #include <syslog.h>  
  8.   
  9. #define MAXF 10000  
  10. int main()  
  11. {     
  12.     int i,fd;  
  13.     pid_t pid;  
  14.   
  15.           /*(1)openlog也可省略*/
  16.          openlog("my_log",LOG_PID,LOG_DAEMON); 
  17.   
  18.     pid=fork();/*<1> 创建子进程,结束父进程*/  
  19.     if(pid<0)  
  20.              perror("fork error!\n");  
  21.         else if(pid>0)/*父进程*/  
  22.         exit(0);  
  23.   
  24.       
  25.     setsid();/*<2>创建会话期,进程成为新的会话组长和新的进程组长*/  
  26.     chdir("/");/*<3>更改当前工作目录*/  
  27.     umask(0);/*<4>设置文件权限*/  
  28.     for(i=1;i<MAXF;i++)/*<5>关闭文件描述符*/  
  29.     close(i);  
  30.       
  31.     /*每5秒,写入文件一次*/  
  32.   
  33.     while(1)  
  34.     {   
  35.                /*(2) syslog写入/var/log/syslog 文件中*/  
  36.                syslog(LOG_ERR,"%s\n","****----open error----****\n");  
  37.         sleep(5);      
  38.     }  
  39.     
  40. }  
  41.    
  42.