APUE函数笔记: 附录

来源:互联网 发布:如何正确使用网络 编辑:程序博客网 时间:2024/05/16 06:36

附录:

#include <stdio.h>#include <errno.h>#include <string.h>#include <stdlib.h>#include <stdarg.h>#include <syslog.h>#define MAXLINE  4096  /* max line length *//* * default file access permissions for new files */#define FILE_MODE  (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)/* * default permissions for new directories */#define DIR_MODE   (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)/* * print a message and return to caller * caller specifies "errnoflag" */void err_doit(int errnoflag, int error, const char * fmt, va_list ap){    int   len;    char  buf[MAXLINE];    vsnprintf(buf, MAXLINE, fmt, ap);    if (errnoflag) {        len = strlen(buf);        snprintf(buf + len, MAXLINE - len, ": %s", strerror(error));    }    strcat(buf, "\n");    fflush(stdout);    /* in case stdout and stderr are the same */    fputs(buf, stderr);    fflush(NULL);      /* flushes all stdio output streams */}/* * 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, and terminate */void err_dump(const char * fmt, ...){    va_list  ap;    va_start(ap, fmt);    err_doit(1, errno, fmt, ap);    va_end(ap);    abort();    /* dump core and terminate */    exit(1);    /* shouldn't get here */}/* * 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 a 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);}/* * caller must define and set this: nonzero if * interactive, zero if daemon */int  log_to_stderr;/* * print a message and return to caller * caller specifies "errnoflag" and "priority" */void log_doit(int errnoflag, int priority, const char * fmt, va_list ap){    int   len;    int   errno_save;    char  buf[MAXLINE];    errno_save = errno;  /* value caller might want printed */    vsnprintf(buf, MAXLINE, fmt, ap);    if (errnoflag) {        len = strlen(buf);        snprintf(buf + len, MAXLINE - len, ": %s", strerror(errno_save));    }    strcat(buf, "\n");    if (log_to_stderr) {        fflush(stdout);        fputs(buf, stderr);        fflush(stderr);    }    else {        syslog(priority, "%s", buf);    }}/* * initialize syslog(), if 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 related 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);}


原创粉丝点击