zoukankan      html  css  js  c++  java
  • 用于守护进程的出错处理函数

    /*
    * Error routines for programs that can run as a daemon.
    */
    
    #include "apue.h"
    #include <errno.h>    /* for definition of errno */
    #include <stdarg.h>    /* ISO C variable arguments */
    #include <syslog.h>
    
    static void log_doit(int, int, const char *, va_list ap);
    
    /*
    * Caller must define and set this: nonzero if
    * interactive, zero if daemon
    */
    extern int log_to_stderr;;
    
    /*
    * Initialize syslog(), is running as daemon.
    */
    void 
    log_open(const char *ident, int option, int facility)
    {
        if(log_to_stderr == 0)
            openlog(ident, option, facility);
    }
    
    /*
    * Nonfatal error related to a system call.
    * Print a message with the system's errno value and return.
    */
    void 
    log_ret(const char *fmt, ...)
    {
        va_list        ap;
        va_start(ap, fmt);
        log_doit(1, LOG_ERR, fmt, ap);
        va_end(ap);
    }
    
    /*
    * Fatal error realted to a system call.
    * Print a message and terminate.
    */
    void
    log_sys(const char *fmt, ...)
    {
        va_list        ap;
        
        va_start(ap, fmt);
        log_doit(1, LOG_ERR, fmt, ap);
        va_end(ap);
        exit(2);
    }
    
    /*
    * Nonfatal error unrelated to a system call.
    * Print a message and return.
    */
    void
    log_msg(const char *fmt, ...)
    {
        va_list        ap;
        
        va_start(ap, fmt);
        log_doit(0, LOG_ERR, fmt, ap);
        va_end(ap);
    }
    
    /*
    * Fatal error unrelated to a system call.
    * Print a message and terminate.
    */
    void
    log_quit(const char *fmt, ...)
    {
        va_list        ap;
        
        va_start(ap, fmt);
        log_doit(0, LOG_ERR, fmt, ap);
        va_end(ap);
        exit(2);
    }
    
    /*
    * Print a message and return to caller.
    * Caller specifies "errnoflag" and "priority". 
    */
    static void
    log_doit(int errnoflag, int priority, const char *fmt, va_list ap)
    {
        int     errno_save;
        char     buf[MAXLINE];
    
        errno_save = errno;    /* value caller might want printed */
        vsnprintf(buf, MAXLINE, fmt, ap);
        if(errnoflag)
            snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s", strerror(errno_save));
        strcat(buf, "
    ");
        if(log_to_stderr)
        {
            fflush(stdout);
            fputs(buf, stderr);    
            fflush(stderr);
        }
        else
        {
            syslog(priority, buf);
        }
    }

    本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

  • 相关阅读:
    MTK Sensor越界导致的系统重启问题分析报告
    WebView兼容问题分析报告
    图片格式问题分析报告
    堆内存double free问题分析报告
    Virsualizer模块野指针问题分析报告
    libjohn hook问题分析报告
    [开发技巧]·Numpy广播机制的深入理解与应用
    [深度应用]·使用一维卷积神经网络处理时间序列数据
    [开发技巧]·Numpy中对axis的理解与应用
    [开发技巧]·HTML检测输入已完成自动填写下一个内容
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3544781.html
Copyright © 2011-2022 走看看