当unix函数出错时,常常返回一个负值,而且整形变量errno通常被设置为含有附加信息的一个值。例如open函数如果成功,返回一个非负文件描述符。如果出错,则返回-1。在open出错时,有大约15种不同的errno值(文件不存在,权限问题等)。
某些函数并不返回负值而是使用另一种预定。例如,返回一个指向对象指针的大多数函数,在出错时,将返回一个空指针。
在<errno.h>中定义了errno以及可以赋予它的各种常量,这些常量都以字符E开头。在linux中,可以通过man 3 errno查看各种出错常量。
对于errno应当知道两条规则:
1、如果没有出错,则其值不会被一个例程清除。因此,仅当函数的返回值指明出错时,才检验其值。
2、任何一个函数都不会将errno值设置为0,在<errno.h>中定义的常量都不为0。
C定义了两个函数,帮助我们打印出错信息。
char* strerror(int errnum);
此函数将errnum(通常是errno的值)映射成一个出错字符串,并且返回此字符串的指针。
void perror(char* msg);
此函数首先输出msg指向的字符串,然后是一个冒号,一个空格,接着是对应errno值的出错信息,最后是一个换行符。
#include <errno.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
fprintf(stderr, "EACCES: %s\n", strerror(EACCES));
errno = ENOENT;
perror(argv[0]);
}