linux C出错处理

 1,assert宠
包含文件:<assert.h>
原型:void assert(int expression) ;
如果expression为假(0),向stderr打印一条出错信息,然后调用函数abort
来终止程序.
在开发阶段通过在<assert.h>的包含语句前插入#define NDEBUG来禁用asset.
#include <stdio.h>
#define NDEBUG
#include <assert.h>
如果定义了NDEBUG,就不会调用assert宏.
2,标准库函数
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设置的出错标志.

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

int ferror(FILE *stream);
如果设置了stream的出错标志则返回真(非0).
3,errno 有很多常用值,在使用前最好先清零.
具体值查看资料.
4,abort函数 比较严厉的函数,会导致程序异常终止,无法进行常规清除工作.
5,exit函数
完成清理工作,并执行atexit注册的函数,但以与注册相反的顺序执行.
6,atexit函数
7,strerror函数
原型: #include <string.h>
char *strerror(int errnum);
返回一个描述和errnum相关的字符串的指针.
8,perror函数
原型: #include <stdio.h>
#include <errno.h>
void perror(const char *s);
perror打印字符串s,之后一个冒号和一个空格,然后是对应errno的错误信
息的换行符.
它们等价: perror("Oops");

printf("Oops: %sn",strerror(errno));
9,系统日志选项
系统日志位于/var/log目录下.
标准控制台日志守护进程是syslogd
级别(消息的重要性)和功能(哪个进程发送的)合起来是它的优先级(priority).
具体的日志级别和功能LOG_XXX,参看其它资料([GUN/Linux编程指南(第二版)
134页).

10,系统日志函数
#include <syslog.h>
void syslog(int priority, char *format,...);
priority由功能和级别相或得到.
定制日志操作函数
#include <syslog.h>
void openlog(const char *ident, int option, int facility);
ident是指定加到消息前的字符串,option是一些选项的“或”值.
为所有的日志消息设置默认级别:
#include <syslog.h>
int setlogmask(int priority);
priority是值或范围值.有两个辅助宏:
LOG_MASK(int priority) //单个优先级组成的掩码
LOG_UPTO(int priority) //priority是允许的最低优先级.创建的是一个范
围的掩码.

11,在Shell中有logger命令,系统日志的shell接口.
logger [-s] [-f file] [-p pri] [-t tag] [-u socket ] [message...]
-i 向日志消息中加入PID
-s 同时向stderr和日志写入日志消息
-f file 向文件写入日志消息.
-p pri 使用pri指定的优先级
-t tag 向日志消息加入字符串tag
-u socket 向socket指定的套接口而不是系统日志写入日志消息.
message 写入日志的消息.

 

《GNU/Linux编程指南》一书中对出错处理部分写的不错。

常用的内容如下:

l         <assert.h>中支持assert()函数,注意,assert()检查发现条件不成立时调用abort()终止程序执行,应用程序没有机会做清除工作。

l         C标准定义了__LINE__和__FILE__宏,GNU C扩展中定义了__FUNCTION__宏。

l         <errno.h>中定义了errno,注意没有函数会将errno清零,所以在调用可能设置errno的函数之前先将errno清零。

l         <stdlib.h>中定义了abort()、exit()和atexit()函数。

l         函数abort()将导致程序异常终止,在终止前程序没有机会执行atexit()登记的函数,也没有计划执行一些常规的清除工作。同时,abort()还会产生core dump,如果没有ulimit限制的话。

l         函数exit()和abort()类似,但它在完成清理工作之后才终止程序。

l         函数atexit()登记在程序正常终止时要调用的函数。

l         <stdio.h>中定义了perror(),<string.h>中定义了strerror()。

l         <syslog.h>中定义了syslogd的接口。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值