参考一

参考二

参考三

参考四

一、 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__\n" );
  7. #else
  8. printf( "define __ASSEMBLER__\n" );
  9. #endif
  10. #ifndef __LIBC
  11. printf( "Undefine __LIBC\n" );
  12. #else
  13. printf( "define __LIBC\n" );
  14. #endif
  15. #ifndef _LIBC_REENTRANT
  16. printf( "Undefine _LIBC_REENTRANT\n" );
  17. #else
  18. printf( "define _LIBC_REENTRANT\n" );
  19. #endif
  20. return 0;
  21. }

参考三

源代码中\n写成了/n,已经更改

会用errno,事半功倍的更多相关文章

  1. ERROR 1010 (HY000): Error dropping database (can't rmdir './test/', errno: 17)

    在删除数据库的时候报标题所示错误 mysql> drop database test; ERROR (HY000): Error dropping database (can't rmdir ' ...

  2. Linux ERRNO

    摘自Linux-3.18.20的头文件include/uapi/asm-generic/errno-base.h和include/uapi/asm-generic/errno.h: #define E ...

  3. C标准头文件<errno.h>

    声明了错误处理相关的宏 errno errno即error number,在程序启动时被设为0,当某个库函数运行出现错误的时候,会将相应的能表达错误类型的数字赋值给这个左值,这些数字往往有相应的宏来表 ...

  4. C 标准库系列之errno.h

    errno.h 提供了一个整数全局变量errno,当系统调用或者库函数的错误事件发生时可能会修改该值,指明错误的原因,该值可在任何需要的地方被修改:一般情况不为0的值表示出现了异常或者错误. errn ...

  5. macosx 10.11 python pip install 出现错误OSError: [Errno 1] Operation not permitted:

    Exception: Traceback (most recent call last): File , in main status = self.run(options, args) File , ...

  6. MongoDB 由于目标计算机积极拒绝,无法连接 2014-07-25T11:00:48.634+0800 warning: Failed to connect to 127.0.0.1:27017, reason: errno:10061

    转载自:http://www.cnblogs.com/xiaoit/p/3867573.html 1:启动MongoDB 2014-07-25T11:00:48.634+0800 warning: F ...

  7. errno

    关于errno有以下需要注意: 1  A common mistake is to do if (somecall() == -1) {                printf("som ...

  8. mysql errno 150

    mysql error Number 1005can't creat table'/test/#sql-640_1.frm'(errno:150)三种可能问题 外键和被引用外键类型不一样,比如inte ...

  9. 安装Cocoapods时候ERROR: While executing gem ... (Errno::EPERM)

    OS X 10.11 安装Cocoapods 出现问题的解决方法 今天尝试用 Cocoapods安装个第三方库.. 输入pod install, 发现 command not find. WTF! 估 ...

随机推荐

  1. 【开源】前端练手笔记,Chrome扩展应用程序(html+CSS+JS) (1)

    项目名称:github-notification 项目地址:https://github.com/WQTeam/github-notification 说明:本人打算抽时间学习前端(html + cs ...

  2. Apache与php的整合(经典版),花了一天去配置成功经验

    1.首先在官方下载php-7.0.7-Win32-VC14-x64.zip和httpd-2.4.20-win64-VC14.zip,也可以下载镜像版的apache:apache_2.4.4-x64-o ...

  3. 《python学习手册》之一——程序运行

    Python解释器执行Python代码时候,大概经历如下几个阶段:(1) 加载代码文件 (2)翻译成AST (3)生成bytecode(.pyc文件,与编译的python版本有关).可以使用pytho ...

  4. jQuery在on绑定事件时,使用Function.prototype.bind上下文,只能用off(event)解绑函数,否则可能导致事件叠加

    因为一个bind函数,未解绑成功导致事件叠加,搞了一下午. keyup事件绑定: this.$document.on('keyup', this.keyUp.bind(this)); 原解绑函数: t ...

  5. 【转】常见 jar包详解

    转载自:http://www.cnblogs.com/xusir/archive/2013/05/19/3086878.html   jar包 用途 axis.jar SOAP引擎包 commons- ...

  6. BZOJ 1048 分割矩阵

    Description 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个),这样分割了(n-1)次后,原矩阵被分割成了 ...

  7. java学习之数组(二)

    在上一节中我们讲到了数组的概念,定义,以及在内存当中的表现形式.那么这里我们来说一下,数组的另一种定义方式. 在上一篇当中我们规定是这个样子定义数组的, class ArrDemo { public ...

  8. POJ2442 Sequence

    题目链接. #include <iostream> #include <cstdio> #include <cstring> #include <cstdli ...

  9. Apache CXF多个远程拒绝服务漏洞(CVE-2013-2160)

    漏洞版本: Apache Group CXF <= 2.5.10 Apache Group CXF 2.7.4 Apache Group CXF 2.6.7 漏洞描述: BUGTRAQ ID: ...

  10. Qt入门(8)——事件和事件过滤器

    在Qt里,一个事件是继承自QEvent的对象.事件通过调用QObject::event(),被发送到继承自 QObject 的对象.事件发送就是一个事件已经产生,由 QEvent正好去表达,且QObj ...