zoukankan      html  css  js  c++  java
  • 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);


  • 相关阅读:
    利用CSS计数函数counter()实现计数
    弹跳加载动画特效Bouncing loader
    HTML页面中解决内容元素随窗口变化布局变乱问题
    CSS中列表项list样式
    框模型中设置内容区域元素占地尺寸box-sizing属性
    PHP100视频教程-->视频下载
    HTML页面中5种超酷的伪类选择器:hover效果
    HTML中获取input中单选按钮radio数据(性别例子)
    HTML中 DOM操作的Document 对象详解(收藏)
    14、输入一个链表,从尾到头打印链表每个节点的值。
  • 原文地址:https://www.cnblogs.com/riskyer/p/3235501.html
Copyright © 2011-2022 走看看