linux调用一个函数失败 打印错误,linux系统调用出错时的处理函数
在進行linux的系統調用, 要判斷調用的成功與否, 調用失敗的情況下就要進行一定的處理,除了打印出消息, 還可以打印系統調用的出錯信息, ?一般性的錯誤不必退出程序, 要是致命性的錯誤就終止整個程序, 基于這個思路《apue》,?和《unix網絡編程》都提供了一系列的出錯處理接口, 很有參考價值,?接口和代碼羅列如下。
頭文件
#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?
#include???/*?ANSI?C?header?file?*/
#include???/*?for?syslog()?*/
#include?
#include?
#include?
#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;
}
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的linux调用一个函数失败 打印错误,linux系统调用出错时的处理函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux mint 时间不对,Linu
- 下一篇: kill掉多个进程linux中的sudo