linux系統調用出錯時的處理函數

     在進行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;
}
相關文章
相關標籤/搜索