错误报告

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) ,通常程序的运行结果打印到标准输出,而错误提示打印到标准错误输出。