经常在调用linux 系统api 的时候会出现一些错误,比方说使用open(), write() ,creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因。这个时候使用errno这个全局变量就相当有用了。
在程序代码中包含 #include<errno.h>,然后每次程序调用失败的时候,系统会自动用用错误代码填充errno这个全局变量,这样你只需要读errno这个全局变量就可以获得失败原因了。
当linux C api函数发生异常时,一般会将errno变量赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,查看错误代码errno是调试程序的一个重要方法。
errno的定义形式如下所示:
#define EPERM 1 /* Operation not permitted */
还有两个与errno相关的函数perror()和strerror(),它们的定义如下所示:
#include <stdio.h> // void perror(const char *msg);
#include <string.h> // char *strerror(int errnum);
perror是错误输出函数,输出格式为:msg:errno对应的错误信息(加上一个换行符);
strerror 是通过参数 errnum (就是errno),返回对应的错误信息,即errno中的注释字符。
在《UNIX高级环境编程》一书中的err_sys()函数是这样定义的:
#define err_sys(info)
{
fprintf(stderr, "%s:%s\n", info, strerror(errno));
exit(EXIT_FAILURE);
}