• errno与perror


          很多系统函数在错误返回时将错误原因记录在libc定义的全局变量errno中,每种错误原因对应一个错误码,请查阅errno(3)Man Page了解各种错误码,errno在头文件errno.h中声明,是一个整型变量,所有错误码都是正整数。

    如果在程序中打印错误信息时直接打印errno变量,打印出来的只是一个整数值,仍然看不出是什么错误。比较好的办法是用perrorstrerror函数将errno解释成字符串再打印。

                   #include<stdio.h>

                   void perror(const char *s);

           perror函数将错误信息打印到标准错误输出,首先打印参数s所指的字符串,然后打印:号,然后根据当前errno的值打印错误原因。例如:

     

    #include<stdio.h>
    #include<stdlib.h>
     
    int main(void)
    {
         FILE *fp = fopen("abcde","r");
         if (fp == NULL) {
             perror("Open fileabcde");
             exit(1);
         }
         return 0;
    }
    

          如果文件abcde不存在,fopen返回-1并设置errnoENOENT,紧接着perror函数读取errno的值,将ENOENT解释成字符串No such file or directory并打印,最后打印的结果是Open file abcde: No such file or directory。虽然perror可以打印出错误原因,传给perror的字符串参数仍然应该提供一些额外的信息,以便在看到错误信息时能够很快定位是程序中哪里出了错,如果在程序中有很多个fopen调用,每个fopen打开不同的文件,那么在每个fopen的错误处理中打印文件名就很有帮助。

    如果把上面的程序改成这样:

     

    #include<stdio.h>
    #include<stdlib.h>
    #include<errno.h>
     
    int main(void)
    {
          FILE *fp = fopen("abcde","r");
          if (fp == NULL) {
                perror("Open fileabcde");
                printf("errno: %d/n",errno);
                exit(1);
          }
          return 0;
    }


           printf 打印的错误号并不是 fopen 产生的错误号,而是 perror 产生的错误号。 errno 是一个全局变量,很多系统函数都会改变它, fopen 函数 Man Page 中的 ERRORS 部分描述了它可能产生的错误码, perror 函数的 Man Page 中没有 ERRORS 部分,说明它本身不产生错误码,但它调用的其它函数也有可能改变 errno 变量。大多数系统函数都有一个 Side Effect ,就是有可能改变 errno 变量(当然也有少数例外,比如 strcpy ),所以一个系统函数错误返回后应该马上检查 errno ,在检查 errno 之前不能再调用其它系统函数。

          strerror函数可以根据错误号返回错误原因字符串。

                    #include<string.h>

                    char*strerror(int errnum);

          返回值:错误码errnum所对应的字符串

          这个函数返回指向静态内存的指针。以后学线程库时我们会看到,有些函数的错误码并不保存在errno中,而是通过返回值返回,就不能调用perror打印错误原因了,这时strerror就派上了用场:

          fputs(strerror(n),stderr);


  • 相关阅读:
    C# 获取Enum 描述
    VC++ Vector取数据,慎用memcpy
    VC++ Char * 保存成bmp和JPEG
    VC++ 应用程序调用MFC DLL里的窗体
    yolov3.cfg参数说明及调参经验
    WIN10+YOLOv4,windows上完美执行YOLOv4目标检测
    Nvdia GPU
    C++ 编程习惯(提高速度)
    VC++发布Dll如何区分Debug和Release
    _CRT_SECURE_NO_WARNINGS错误提示,解决办法
  • 原文地址:https://www.cnblogs.com/riskyer/p/3235501.html
Copyright © 2020-2023  润新知