出错处理

1.assert宏

#include<assert.h>

void assert(int expressio);

禁用assert宏

#define NDEBUG

2.预编译

_LINE_,_FILE_宏

_LINE_,为int型行号。

_FILE_,为char*型文件名。

_FUNCTION_,为当前函数的名字,属于GNU C扩展。

3.标准库函数

stdlib.h       void abort(void);

stdlib.h       void exit(int status);

stdlib.h       int atexit(void (*fcn)(void));

stdio.h        void perror(const char *s);

string.h       char *strerror(int errnum);

errno.h       int errno;

stdio.h        void clearerr(FILE *stream);  //清除EOF(end-of-file)条件以及任何为stream设置的出错标志。

stdio.h        int feof(FILE * stream);        //如果设置了stream的EOF标志则返回真(非0)。

stdio.h        int ferror(FILE* stream);      //如果设置了stream的出错标志则返回真(非0);

linux系统调用和许多但不是所有的库函数在出错时都要把全局变量errno设置为一个非0值。但是没有库函数能把errno清零,而有时-1是一个合法的返回值。最好在在调用一个设置errno的函数前清零。

errno=0;

<errno.h>中定义了多种错误代码。

abort函数会导致程序异常终止,程序在被终止前不能进行一些常规的清除工作。不处理atexit

abort会向os返回一个预先定义的值以便告诉操作系统这是一个不成功的终止。

如果没有ulinit的限制,abort还会卸下一个core文件。

 

exit在完成清理工作后才终止程序。处理atexit。

status是exit函数返回给操作系统的退出值。

 

atexit登记在程序正常终止时要调用的函数,不是由exit调用就是通过程序的main函数返回来调用。

如果fcn登记成功,atexit返回0

 

strerror返回errno的可读提示信息。

 

perror(const char* s);

首先打印s,之后打印可读信息和错误号。

 

4 系统日志

klogd内核和运行在内核空间的程序。

syslogd用户空间程序的消息。

系统日志位于/var/log,版本不同,这些日志文件包括message,debug,mail,news,可能还有secure。取决于/etc/syslog.conf中定义的日志功能配置。标准的控制台日志守护进程是syslog,由它来维护这些日志文件。写入系统日志的消息由它的级别level和功能facility来控制,级别指出了消息的严重性或重要性,功能告诉维护系统日志的syslogd守护进程是哪个程序发送的这条消息。级别和功能合起来被称为优先级。

level:

LOG_EMERG

LOG_ALERT

LOG_CRIT

LOG_ERR

LOG_WARNING

LOG_NOTICE

LOG_INFO

LOG_DEBUG

facility:

LOG_AUTHPRIV

LOG_CRON

LOG_DAEMON

LOG_KERN

LOG_LOCAL[0-7]

LOG_LPR

LOG_MAIL

LOG_NEWS

LOG_SYSLOG

LOG_USER

LOG_UUCP

#include <syslog.h>

void syslog(int priority, char *format, ...)

priority是级别和功能的位逻辑“或”值。特殊的格式说明字符%m由strerror为errno分配的错误信息进行替换。

#include<syslog.h>

void openlog(const char* ident, int option, int facility);

定制日志操作。

facility是功能值,ident指定了加到日志消息前的字符串。option是表中零个或者多个选项的位逻辑“或”值。

option:

LOG_PID

LOG_CONS

LOG_NDELAY

LOG_PERROR

#include<syslog.h>

int setlogmask(int priority);

为所有的日志消息设置了默认的级别。设置了优先级默认的掩码。syslog拒绝任何没有在掩码只设置的优先级消息。返回值是原先优先级的掩码。

LOG_MASK(int priority)创建一个仅由一个优先级组成的掩码。

LOG_UPTO(int priority)创建一个由一系列降序优先级组成的掩码,这里的priority是允许的最低优先级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值