05 守护进程的出错处理

来源:互联网 发布:java程序设计案例教程 编辑:程序博客网 时间:2024/06/10 11:55
 

守护进程的出错处理

由于守护进程完全脱离了控制终端,因此,不能像其他程序一样通过输出错误信息到控制台的方式来通知程序员。

通常的办法是使用syslog服务,将出错信息输入到“/var/log/message”系统日志文件中去。

Syslog是linux中的系统日志管理服务通过守护进程syslog来维护。

 

Openlog函数用于打开系统日志服务的一个连接;

Syslog函数用于向日志文件中写入消息,在这里可以规定消息的优先级、消息的输出格式等;

Closelog函数用于关闭系统日志服务的连接。

1)openlog函数

#include <syslog.h>

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

Ident:要向每个消息加入的字符串,通常为程序的名称;

option参数

n       LOG_CONS: 若日志消息不能通过发送至syslogd ,则将该消息写至控制台;

n       LOG_NDELAY: 立即打开UNIX域数据报套接口至syslsgd守护进程。通常,在记录第一条消息之前,该套接口不打开。

n       LOG_PERROR:除将日志消息发送给syslog外,还将它写至标准出错(stderr)。

n       LOG_PID:每条消息都包含进程ID,此选择项可供对每个请求都fork一个子进程的守护进程使用。

openlog的facility参数

n       LOG_AUTH 授权程序: login.su,getty, ⋯

n       LOG_CRONcron 和 at

n       LOG_DAEMON 系统守护进程:ftpd,routed, ⋯

n       LOG_KERN 内核产生的消息

n       LOG_LOCAL0~7  保留由本地使用

n       LOG_LPR 行打系统:lpd, lpc, ⋯

n       LOG_MAIL 邮件系统

n       LOG_NEWSU senet网络新闻系统

n       LOG_SYSLOG syslogd守护进程本身

n       LOG_USER 来自其他用户进程的消息

n       LOG_UUCP UUCP系统

(2)syslog函数

#include <syslog.h>

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

Priority选项(消息优先级)

n       LOG_EMERG 紧急(系统不可使用) (最高优先级)

n       LOG_ALERT 必须立即修复的条件

n       LOG_CRIT 临界条件(例如,硬设备出错)

n       LOG_ERR 出错条件

n       LOG_WARNING 警告条件

n       LOG_NOTICE 正常,但重要的条件

n       LOG_INFO 信息性消息

n       LOG_DEBUG 调试排错消息(最低优先级)

3)closelog函数

#include <syslog.h>

void closelog(void);

 

举例:

#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);

}

 

 

原创粉丝点击