UNIX环境高级编程一书中示例程序经常使用的错误处理函数。
把这些函数保存到一个文件中,方便学习使用。
my_err.h
#include <errno.h> #include <stdarg.h> static void err_doit(int, const char*, va_list); char *pname = NULL; void err_ret(const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(1, fmt, ap); va_end(ap); return ; } void err_sys(const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(1, fmt, ap); va_end(ap); exit(1); } void err_dump(const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(1, fmt, ap); va_end(ap); abort(); exit(1); } void err_msg(const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(0, fmt, ap); va_end(ap); return ; } void err_quit(const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(0, fmt, ap); va_end(ap); exit(1); } static void err_doit(int errnoflag, const char *fmt, va_list ap) { int errno_save; char buf[MAXLINE]; errno_save = errno; vsprintf(buf, fmt, ap); if(errnoflag) sprintf(buf+strlen(buf), ":%s", strerror(errno_save)); strcat(buf,"\n"); fflush(stdout); fputs(buf, stderr); fflush(NULL); return ; }
my_log.h
#include <errno.h> #include <stdarg.h> #include <syslog.h> #include "ourhdr.h" static void log_doit(int, int, const char*, va_list ap); extern int debug; void log_open(const char *ident, int option, int facility) { if(debug==0) openlog(ident, option, facility); } void log_ret(const char *fmt, ...) { va_list ap; va_start(ap, fmt); log_doit(1, LOG_ERR, fmt, ap); va_end(ap); return ; } 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); } void log_msg(const char *fmt, ...) { va_list ap; va_start(ap, fmt); log_doit(0, LOG_ERR, fmt, ap); va_end(ap); return ; } 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); } static void log_doit(int errnoflag, int priority, const char *fmt, va_list ap) { int errno_save; char buf[MAXLINE]; errno_save = errno; vsprintf(buf, fmt, ap); if(errnoflag) sprintf(buf+strlen(buf), ": %s", strerror(errno_save)); strcat(buf, "\n"); if(debug){ fflush(stdout); fputs(buf, stderr); fflush(stderr); } else syslog(priority, buf); return ; }