在進行linux的系統調用, 要判斷調用的成功與否, 調用失敗的狀況下就要進行必定的處理,除了打印出消息, 還能夠打印系統調用的出錯信息, 通常性的錯誤沒必要退出程序, 要是致命性的錯誤就終止整個程序, 基於這個思路《apue》, 和《unix網絡編程》都提供了一系列的出錯處理接口, 頗有參考價值, 接口和代碼羅列以下。linux
頭文件編程
#ifndef _SYS_ERROR_H__ #define _SYS_ERROR_H__
//非致命的系統錯誤,不終止程序 extern void err_msg(const char *fmt, ...);
//非致命的系統錯誤,不終止程序, 附帶打印系統的出錯信息 extern void err_ret(const char *fmt, ...);
//致命的系統錯誤,終止程序 extern void err_quit(const char *fmt, ...);
//致命的系統錯誤,終止程序, 附帶打印系統的出錯信息 extern void err_sys(const char *fmt, ...);
//致命的系統錯誤,終止程序, 附帶打印系統的出錯信息 extern void err_dump(const char *fmt, ...);
#endif //_SYS_ERROR_H__
源文件:網絡
#include <stdio.h> #include <stdarg.h> /* ANSI C header file */ #include <syslog.h> /* for syslog() */ #include <errno.h> #include <stdlib.h> #include <string.h> #include "syserror.h"
#define HAVE_VSNPRINTF 1 #define MAXLINE 1024
int daemon_proc; /* set nonzero by daemon_init() */
static void err_doit(int, int, const char *, va_list);
/* Nonfatal error related to system call * Print message and return */
void err_ret(const char *fmt, ...) { va_list ap;
va_start(ap, fmt); err_doit(1, LOG_INFO, fmt, ap); va_end(ap); return; }
/* Fatal error related to system call * Print message and terminate */
void err_sys(const char *fmt, ...) { va_list ap;
va_start(ap, fmt); err_doit(1, LOG_ERR, fmt, ap); va_end(ap); exit(1); }
/* Fatal error related to system call * Print message, dump core, and terminate */
void err_dump(const char *fmt, ...) { va_list ap;
va_start(ap, fmt); err_doit(1, LOG_ERR, fmt, ap); va_end(ap); abort(); /* dump core and terminate */ exit(1); /* shouldn't get here */ }
/* Nonfatal error unrelated to system call * Print message and return */
void err_msg(const char *fmt, ...) { va_list ap;
va_start(ap, fmt); err_doit(0, LOG_INFO, fmt, ap); va_end(ap); return; }
/* Fatal error unrelated to system call * Print message and terminate */
void err_quit(const char *fmt, ...) { va_list ap;
va_start(ap, fmt); err_doit(0, LOG_ERR, fmt, ap); va_end(ap); exit(1); }
/* Print message and return to caller * Caller specifies "errnoflag" and "level" */
static void err_doit(int errnoflag, int level, const char *fmt, va_list ap) { int errno_save, n; char buf[MAXLINE + 1];
errno_save = errno; /* value caller might want printed */ #ifdef HAVE_VSNPRINTF vsnprintf(buf, MAXLINE, fmt, ap); /* safe */ #else vsprintf(buf, fmt, ap); /* not safe */ #endif n = strlen(buf); if (errnoflag) snprintf(buf + n, MAXLINE - n, ": %s", strerror(errno_save)); strcat(buf, "\n");
if (daemon_proc) { syslog(level, buf); } else { fflush(stdout); /* in case stdout and stderr are the same */ fputs(buf, stderr); fflush(stderr); } return; }