C/C++ Linux 出错处理函数(strerror 与 perror)

Posted cpp_learners

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++ Linux 出错处理函数(strerror 与 perror)相关的知识,希望对你有一定的参考价值。

我们知道,系统函数调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面可以迅速得到故障信息。

有两种方式:

1. strerror - 需要将错误信息输出到日志;

2. perror - 不需要将错误信息输出到日志。


一、strerror 

#include <errno.h>

#include <string.h>

char * strerror (int errnum);     /* See NOTES */

errnum:

    传入参数,错误编号的值,一般取 errno 的值;

返回值

    错误原因;

作用:

调用任何系统函数,当出错后,系统都会将错误代号赋值给全局变量errno,当出现错误后,我们就可以使用函数strerror传参errno,就会返回对应的出错信息了。

具体使用案例:

fprintf(stderr, "error, reason: %s\\n", strerror(errno));

为什么说,需要将错误信息输出到日志文件时要使用strerror函数呢,因为strerror函数转换后返回char *指针,我们拿到这个指针后就可以将这个指针字符串写入日志文件中去啦。

下面会讲解为什么使用perno函数就不可以这样操作!

例:

1. 打开文件失败

#include <errno.h>         // errno
#include <string.h>        // strerror
#include <stdio.h>         // printf
#include <stdlib.h>        // exit

int main (int argc, char *argv[]) 

    FILE *fp = NULL;
    fp = fopen("./123/test.txt", "r");
    if (NULL == fp) 
        char *err = strerror(errno);
        fprintf(stderr, "open file error, reason: %s\\n", err);
        //fprintf(stderr, "open file error, reason: %s\\n", strerror(errno));
        exit(-1);
    

    printf("open file success!\\n");

    return 0;

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
open file error, reason: No such file or directory

其中,“No such file or directory” 就是我们通过strerror函数获取到的错误信息! 

2. 创建socket失败

#include <stdio.h>         // printf
#include <sys/types.h>     // socket
#include <sys/socket.h>    // socket
#include <stdlib.h>        // exit
#include <errno.h>         // errno
#include <string.h>        // strerror

int main (int argc, char *argv[]) 

    int sock = 0;

    sock = socket(-1, SOCK_STREAM, 0);
    if (-1 == sock) 
        fprintf(stderr, "create socket error, reason: %s\\n", strerror(errno));
        exit(-1);
    

    return 0;

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
create socket error, reason: Address family not supported by protocol

其中,“Address family not supported by protocol” 就是我们通过strerror函数获取到的错误信息! 


二、perror

#include <stdio.h>

#include <errno.h>

void perror (const char *s);    /* See NOTES */

s:

    传入参数,自定义的描述;

返回值:

    无;

作用:

向标准出错stderr 输出错原因 。

具体使用案例:

perror("create socket error ");

将需要提示的字符串传参给perror函数即可,它相当于:

fprintf(stderr, "create socket error : ", strerror(errno));

perror是直接向出错标准stderr输出错误原因!

例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main (int argc, char *argv[]) 

    int sock = 0;

    sock = socket(-1, SOCK_STREAM, 0);
    if (-1 == sock) 
        perror("create socket error ");
        exit(-1);
    

    return 0;

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
create socket error : Address family not supported by protocol

其中,“Address family not supported by protocol” 就是我们通过perror函数输出的错误信息! 

因为他是直接向出错标准stderr输出错误原因,我们没法通过它获得错误信息字符串,所以也就没法将其写入日志文件中!


最后,调用系统的任何函数,当出现了错误,都可以使用以上两种方式进行打印输出错误信息,从而更轻易的帮助我们找出对应问题!

如果需要将错误信息输出到日志文件,使用strerror 函数;否则可以使用perror函数。

注意:以上介绍的 适用于任何Linux函数,例如open、write等。

完!

以上是关于C/C++ Linux 出错处理函数(strerror 与 perror)的主要内容,如果未能解决你的问题,请参考以下文章

使用GNU/gdb调试Linux C/C++可执行程序查看出错源代码、设置断点

C语言 | 二维数组作为函数参数

重定向对象列表以使用 lambda 减少函数时出错

Linux C/C++ 崩溃诊断大师:解锁软件问题定位与修复的秘密武器

出错处理函数

出错处理2——包裹函数