输出至标准出错文件的出错处理函数

[root@localhost unix_env_advance_prog]# cat error.c 
#include "apue.h"
#include <errno.h>
#include <stdarg.h>

static void err_doit(int, int, const char *, va_list);

/*
* Nonfatal error related to a system call.
* Print a message and return.
*/
void
err_ret(const char *fmt, ...)
{
        va_list ap;

        va_start(ap, fmt);
        err_doit(1, errno, fmt, ap);
        va_end(ap);
}

/*
* Fatal error related to a system call.
* Print a message and terminate.
*/
void err_sys(const char *fmt, ...)
{
        va_list ap;

        va_start(ap, fmt);
        err_doit(1, errno, fmt, ap);
        va_end(ap);
        exit(1);
}

/*
* Fatal error unrelated to a system call.
* Error code passed as explict parameter.
* Print a message and terminate.
*/
void 
err_exit(int error, const char *fmt, ...)
{
        va_list ap;

        va_start(ap, fmt);
        err_doit(1, error, fmt, ap);
        va_end(ap);
        exit(1);
}

/*
* Fatal error related to a system call.
* Print a message, dump core dand terminate.
*/
void 
err_dump(const char *fmt, ...)
{
        va_list ap;

        va_start(ap, fmt);
        err_doit(1, errno, fmt, ap);
        va_end(ap);
        abort();
        exit(1);
}

/*
* Nonfatal error unrelated to a system call.
* Print a message and return.
*/
void 
err_msg(const char *fmt, ...)
{
        va_list ap;

        va_start(ap, fmt);
        err_doit(0, 0, fmt, ap);
        va_end(ap);
}

/*
* Fatal error unrelated to system call.
* Print a message and terminate.
*/
void err_quit(const char *fmt, ...)
{
        va_list ap;

        va_start(ap, fmt);
        err_doit(0, 0, fmt, ap);
        va_end(ap);
        exit(1);
}

/* 
* Print a message and return to caller.
* Caller specifies "errnoflag".
*/
static void
err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
        char buf[MAXLINE];
        vsnprintf(buf, MAXLINE, fmt, ap);
        if(errnoflag)
                snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s", strerror(error));
        strcat(buf, "
");
        fflush(stdout);
        fputs(buf, stderr);
        fflush(NULL);
}
原文地址:https://www.cnblogs.com/nufangrensheng/p/3495026.html