• 用于守护进程的出错处理函数


    /*
    * 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/

  • 相关阅读:
    MySQL慢日志
    百万级数据生成。
    layui的数据表格加上操作
    WINDOWS命令行关闭本地占用的端口
    项目中路径问题
    linux服务器上使用find查杀webshell木马方法
    mysql锁分析相关的几个系统视图
    Centos7中网络及设备相关配置
    centos7版本中ssh相关的设置
    mysql权限参考
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3544781.html
Copyright © 2020-2023  润新知