这篇文章主要总结 Linux/C 下常用的捕捉错误信息的函数用法和一些注意事项,包括strerror()、perror()、ferror()
0x01 strerror:返回错误原因的描述字符串
#include
char * strerror(int errnum);
说明: strerror()
依参数 errnum
(错误代码)来查询其错误原因的描述字符串, 然后将该字符串指针返回。
返回值: 描述错误原因的字符串指针 实例:
/* 显示错误代码0 至9 的错误原因描述 */
#include
int main(int argc, char* argv[])
{
int i;
for(i = 0; i < 10; i++)
printf(%d : %s\n, i, strerror(i));
}
执行结果:
0 : Success
1 : Operation not permitted
2 : No such file or directory
3 : No such process
4 : Interrupted system call
5 : Input/output error
6 : Device not configured
7 : Argument list too long
8 : Exec format error
9 : Bad file descriptor
0x02 perror():打印最近一次系统错误信息
函数原型: void perror(char *string);
说明:perror()
用于输出最近一次的系统错误信息,该错误由全局变量 error
决定。
参数:string
自定义要输出的字符串,会在 错误信息 之前输出。
注:errno
变量是一个全局变量且多线程安全,每个 errno
值对应着以字符串表示的错误原因。当你调用某些函数出错时,该函数会设置 errno
的值。 实例:打开一个不存在的文件并输出错误信息
#include
#include
#include
int main(int ragc, char* argv[])
{
FILE *fp;
fp = fopen( test.txt, w ); /* 打开文件 */
assert( fp ); /* 断言不为空 */
fclose( fp ); /* 关闭 */
fp = fopen( nulltest.txt, r ); /* 打开一个不存在的文件 */
if ( NULL == fp )
{
/* 显示最近一次错误信息 */
perror(打开 nulltest.txt 出错);
}
return 0;
}
运行结果:
打开 nulltest.txt 出错: No such file or directory
如果连续调用perror,如下:
perror(1);
perror(2);
会出现以下结果:
1:success
2:Illegal seek
原因是:
perror()通过 lseek 函数根据 errorno 查找对应的错误信息,然后输出。
每次调用 perror 方法,都会首先输出 errorno 对应的信息,然后重置 errorno 为 undefined,这时如果马上再一次调用 perror,perror 会调用 lseek 根据当前的 errorno 即 undefined 去查找错误信息,这样就会报错并记录在 errorno 中。因此,第二次 perror 会把 lseek 的错误打印出来。
0x03 ferror:检查文件流是否有错误发生
函数原型:
int ferror(FILE *stream);
说明:ferror()
用来检查参数 stream
所指定的文件流是否发生了错误情况, 如有错误发生则返回非0值
返回值:如果文件流有错误发生则返回非0值