这篇文章主要总结 Linux/C 下常用的捕捉错误信息的函数用法和一些注意事项,包括strerror()、perror()、ferror()

0x01 strerror:返回错误原因的描述字符串

#include <string.h>
char * strerror(int errnum);

说明:
strerror()依参数 errnum (错误代码)来查询其错误原因的描述字符串, 然后将该字符串指针返回。

返回值:
描述错误原因的字符串指针

实例:

/* 显示错误代码0 至9 的错误原因描述 */
#include <string.h>
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 <stdio.h>
#include <assert.h>
#include <stdlib.h>
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:检查文件流是否有错误发生

头文件:

#include <stdio.h>

函数原型:

int ferror(FILE *stream);

说明:ferror()用来检查参数 stream 所指定的文件流是否发生了错误情况, 如有错误发生则返回非0 值
返回值:如果文件流有错误发生则返回非0值