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/

  • 相关阅读:
    如何保证你的路由器安全?
    Jmeter、fiddler、postman 如何模拟ajax请求
    U盘快速格式化和普通格式化有什么区别
    Layui button disabled
    TP连接数据库字符串方式
    Warning: require(D:wamp64wwwxxxpublic/../thinkphp/start.php): failed to open stream: No such file or directory in D:wamp64www xxx publicindex.php on line 17
    [AWS] EC2
    [AWS] EC2
    [AWS] EC2
    [AWS DA
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3544781.html
Copyright © 2011-2022 走看看