<errno.h>
:错误
- 标准库中的一些函数通过向
<erron.h>
中声明的int型errno变量存储一个错误码(正整数)来表示有错误发生。
- 如果使用的一个库函数,通过给errno赋值来产生程序运行出错的信号,我们可以在调用这个函数之后,==检查erron的值是否为0==,来判断函数调用过程中是否有错误发生。
- 使用errno来检测函数调用的错误,需要==在函数调用前将errno置零==。
- errno中存储的错误值经常是以下两个宏:
- EDOM(定义域错误):传递给函数的一个参数==超出了定义域==,使用这个宏。
- ERANGE(取值范围错误):函数的==返回值太大,无法用返回类型==。
- 与变量errno有关的两个函数(都不属于
<errno.h>
):
- perror函数:
- 在
<stdio.h>
中声明,用于显示描述错误的信息;perror函数会==输出到stderr流==。
- 原型:
void perror(const char *s)
- 参数:
- 返回值:
- 依次显示下列内容:
- 调用perror的参数;
- 一个分号;
- 一个空格;
- 一条出错消息:消息的内容根据errno的值决定;
- 一个换行符。
- 示例:
perror("sqrt error"); sqrt error: Numercial argument out of domain
- strerror函数:
- 在
<string.h>
声明,当以错误码为参数调用strerror时,函数会==返回一个指针,它指向一个描述这个错误的字符串==;
- 原型:
char *strerror(int errnum)
- 参数:
- strerror函数的参数==通常是errno的值==,但以任意整数为参数都能返回一个字符串。
- 示例:
puts(strerror(EDOM))
- 对于同一个错误,perror函数和strerror函数返回的消息的值是相同的。
- 示例:
errno = 0;
y = sqrt(x);
if(errno != 0) {
perror("sqrt error");
puts(strerror(erron));
}
<signal.h>
:信号处理
<signal.h>
提供了==处理异常情况(异常情况又称为信号)的工具==。
- 信号:当有错误或者外部事件发生时,称为产生了一个信号。很多信号可以在程序执行过程中的任意时刻发生。
- 信号类型:
- ==运行时错误==,如(除以0);
- ==发生在程序以外的事件==,如:操作系统对正在运行的程序的中断信号。
- 信号宏:
- 信号宏:
<signal.h>
中定义了一系列的宏,==用于表示不同的信号==;
- 6种信号宏:
SIGABRT
:异常终止;
SIGFPE
:在算术运算中发生错误;
SIGILL
:无效指令;
SIGINT
:中断;
SIGSEGV
:无效存储访问;
SIGTERM
:终止请求。
- signal函数:
- signal是
<signal.h>
提供的,用来==安装信号处理函数,以便将来给定的信号发生时使用==。
- 原型:
void (*signal(int sig, void (*func)(int)))(int)
- 参数:
- 第一个参数是==特定信号的编码(表示不同信号的宏)==;
- 第二个参数是==一个指向会在信号发生时处理这一信号的函数的指针==;
- 返回值:
- 一旦调用信号处理函数返回,==程序会从信号发生点恢复并继续执行==,除了SIGABRT和SIGFPE两种信号。
- signal的返回值是一个==指向指定信号的前一个处理函数的指针==。可以用于恢复原来的处理函数。
- 如果一个signal函数调用失败,==会返回SIG_ERR(一个在
<signal.h>
中定义的宏)并在errno中存入一个正值。==
- 信号处理函数:
- 自定义信号处理函数:
- 每个信号处理函数都必须有一个==int类型的参数==,且返回类型为void。
- 当一个特定的信号产生并调用相应的信号处理函数时,==信号的编码会作为参数传递给处理函数==。
- 预定义的信号处理函数:
<signal.h>
提供了一些预定义的信号处理函数,这些函数==都是用宏表示的==。
- SIG_DFL:
- 按==默认==方式处理信号。
- 调用该函数的结果是由实现定义的,但大多数情况下会导致程序终止。
- SIG_IGN:
- raise函数:
<signal.h>
中声明,用来==使程序主动触发信号==。
- 原型:
int raise(int sig)
- 参数:
- 返回值:
- raise函数的返回值,代表产生信号是否成功:==成功为0,失败为非0==。