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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值