zoukankan      html  css  js  c++  java
  • 会用errno,事半功倍

    参考一
    参考二
    参考三
    参考四

    一、 errno

    包含了头文件errno.h后就能直接使用该变量。
    该变量在头文件中的定义

    1. #ifndef errno
    2. extern int errno;
    3. #endif

    该头文件在/usr/include/errno.h:

    该变量用于保存程序的错误码,如果程序执行正确,则该变量不会更新。这些错误码通常是被定义在errno.h中以E开头的宏。
    #define EDOM 33
    该头文件在/usr/include/asm/errno.h,在Ubuntu 16.04-64系统上,该头文件路径是/usr/include/asm-generic/errno.h
    如下图:

    以及

    因为,errno可以把最后一次调用C的错误代码保留,如果最后一次调用C函数成功,则不会更改errno,所以如果你要使用之前,可以先清空errno,然后通过errno判断下面要执行的函数是否成功

    二、 把errno的数字转换成相应的文字说明

    1、 使用strerror函数

    • 函数原型:
      char * strerror(int errno)
    • 使用方法:
      fprintf(stderr, "%s", strerror(errno));

    2、 使用perror函数

    • 函数原型:
      void perror(const char *s)
    • 使用说明
      参数s指定的字符串是要先打印出来的信息,可以由我么自己定义,然后系统会在s字符串后加上错误原因的字符串。

    三、 errno的线程/进程安全性

    想想吧,之前已经说了errno是全局变量,如果在多线程或者进程编程中,子线程想要查看errno确定自己的错误类型,可惜该errno被另一个线程更改了,这就出问题了。errno的线程/进程安全性指的就是这点,在多线程和多进程编程中,errno会不会变为线程或进程的私有变量。实际上,GCC就是这样处理的,在Ubuntu 16.04 64bit系统上,代开/usr/include/x86_64-linux-gnu/bints/errno.h中你会发现

    When using threads, errno is a per-thread value

    当使用线程时,errno会编程每个线程的值(每个线程都独有一个)

    所以在并发编程中使用errno的时候一定要定义宏_LIBC_REENTRANT

    附录

    附上网友测试编译器是否支持errno相关宏的测试代码:

    1. #include <stdio.h>
    2. #include <errno.h>
    3. int main( void )
    4. {
    5. #ifndef __ASSEMBLER__
    6. printf( "Undefine __ASSEMBLER__ " );
    7. #else
    8. printf( "define __ASSEMBLER__ " );
    9. #endif
    10. #ifndef __LIBC
    11. printf( "Undefine __LIBC " );
    12. #else
    13. printf( "define __LIBC " );
    14. #endif
    15. #ifndef _LIBC_REENTRANT
    16. printf( "Undefine _LIBC_REENTRANT " );
    17. #else
    18. printf( "define _LIBC_REENTRANT " );
    19. #endif
    20. return 0;
    21. }

    参考三
    源代码中 写成了/n,已经更改





  • 相关阅读:
    P20 HTTP 方法的安全性与幂等性
    P19 查询参数
    P18 写代码:过滤和搜索
    P17 过滤和搜索
    P16 HTTP HEAD
    golang的json操作[转]
    Android中的Service 与 Thread 的区别[转]
    iOS的block内存管理
    Go并发编程基础(译)
    golang闭包里的坑
  • 原文地址:https://www.cnblogs.com/fjutacm/p/5969c7593fdb6516c11a55b0e6813938.html
Copyright © 2011-2022 走看看