错误报告
错误报告
errno
errno定义在<errno.h>头文件中,外部变量errno保存库程序中实现定义的错误码,通常被定义为errno.h中以E开头的宏,所有错误码都是正整数。
在linux中使用c语言编程时,errno很有用的。他可以把最后一次调用c的方法的错误代码保留。但是如果最后一次成功的调用c的方法,errno不会改变。因此,只有在c语言函数返回值异常时,再检测errno。errno会返回一个数字,每个数字代表一个错误类型。详细的可以查看头文件。/usr/include/asm/errno.h
如何把errno的数字转换成相应的文字说明?
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <math.h>
int main(void)
{
errno = 0;
int s = sqrt(-1);
if (errno) {
printf("errno = %d\n", errno); // errno = 33
perror("sqrt failed"); // sqrt failed: Numerical argument out of domain
printf("error: %s\n", strerror(errno)); // error: Numerical argument out of domain
}
return 0;
strerror
strerror定义在<string.h>中,
char *strerror(int errno)
函数strerror返回一个错误消息字符串的指针,其内容是由实现定义的,字符串不能修改,但可以在后续调用strerror函数时覆盖。
perror
perror定义在<stdio.h>中:
void perror(const char *s)
perror ( )用来将上一个函数发生错误的原因输出到标准错误(stderr),参数s 所指的字符串会先打印出,后面跟一个分号和一个空格,然后打印出一条用于解释errno当前错误代码的信息。
终止执行
exit函数用于终止一个程序的执行,它的原型定义在stdlib.h,其定义:
void exit(int status);
exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。main函数结束时也会隐式地调用exit函数。
预定义符号EXIT_SUCCESS 和 EXIT_FAILURE分别表示程序终止成功还是失败。
经常在调程序发现错误无法继续执行时,先调用perror函数再调用exit函数退出。
stdin/stdout/stderr
那为什么printf和scanf不用打开就能对终端设备进行操作呢?因为在程序启动时(在main函数还没开始执行之前)会自动把终端设备打开三次,分别赋给三个FILE *指针stdin、 stdout和stderr,这三个文件指针是libc中定义的全局变量,在stdio.h中声明, printf向stdout写,而scanf从stdin读,后面我们会看到,用户程序也可以直接使用这三个文件指针。这三个文件指针的打开方式都是可读可写的,但通常stdin只用于读操作,称为标准输入(Standard Input) , stdout只用于写操作,称为标准输出(Standard Output) , stderr也只用于写操作,称为标准错误输出(Standard Error) ,通常程序的运行结果打印到标准输出,而错误提示打印到标准错误输出。