使用errno检测错误
很多库函数,特别是那些与操作系统有关的,当执行失败时会通过一个名称为errno的外部变量,通知程序该函数调用失败。如:
/* 调用库函数 */
if(errno)
/* 处理错误 */
上面看似清楚明了的代码,其实是错误的,出错原因在于,在库函数没有失败的情况下,并没有强制要求库函数一定要设置errno为0,这样errno的值可能是前一个执行失败的库函数设置的值。做如下修改:
errno = 0;
/* 调用库函数 */
if(errno)
/* 处理错误 */
这下应该行了吧,但仍然是错误的。库函数在调用成功是,既没有强制要求对errno清零,同时也没有禁止设置errno。如调用fopen库函数时,当fopen被要求新建一个文件以供程序输出时,如果已经存在一个同名文件,fopen函数将先删除它,再新建一个文件,及fopen可能调用其他的库函数用于检查文件是否存在(假设该库函数在文件不存在时,设置errno的值),则fopen在每次新建一个不存在的文件时,errno被设置。因此在调用库函数是,应先检测作为错误指示的返回值,确定程序执行失败,再检查errno,以弄清楚出错原因,应按如下方式书写代码:
/* 调用库函数 */
if( 返回的错误值)
检查errno