当前位置: 首页 > news >正文

linux中c语言errno的使用

在linux中使用c语言编程时,errno是个很有用的动动。他可以把最后一次调用c的方法的错误代码保留。但是如果最后一次成功的调用c的方法,errno不会改变。因此,只有在c语言函数返回值异常时,再检测errno。

errno会返回一个数字,每个数字代表一个错误类型。详细的可以查看头文件。/usr/include/asm/errno.h

如何把errno的数字转换成相应的文字说明?
方式一:可以使用strerrno函数


char *strerror(int errno)

使用方式如下:


fprintf(stderr,"error in CreateProcess %s, Process ID %d ",strerror(errno),processID)

将错误代码转换为字符串错误信息,可以将该字符串和其它的信息组合输出到用户界面。
注:假设processID是一个已经获取了的整形ID

方式二:使用perror函数


void perror(const char *s)

函数说明
perror ( )用来将上一个函数发生错误的原因输出到标准错误(stderr),参数s 所指的字符串会先打印出,后面再加上错误原因 字符串。此错误原因依照全局变量 errno 的值来决定要输出的字符串。

另外并不是所有的c函数调用发生的错误信息都会修改errno。例如gethostbyname函数。

errno是否是线程安全的?
errno是支持线程安全的,而且,一般而言,编译器会自动保证errno的安全性。
我们看下相关头文件 /usr/include/bits/errno.h
会看到如下内容:


# if !defined _LIBC || defined _LIBC_REENTRANT
 /* When using threads, errno is a per-thread value. */
 # define errno (*__errno_location ())
 # endif
 # endif /* !__ASSEMBLER__ */
 #endif /* _ERRNO_H */ 

也就是说,在没有定义__LIBC或者定义_LIBC_REENTRANT的时候,errno是多线程/进程安全的。
为了检测一下你编译器是否定义上述变量,不妨使用下面一个简单程序。


#include <stdio.h>
#include <errno.h>
 
int main( void )
{
#ifndef __ASSEMBLER__
        printf( "Undefine __ASSEMBLER__/n" );
#else
        printf( "define __ASSEMBLER__/n" );
#endif
 
#ifndef __LIBC
        printf( "Undefine __LIBC/n" );
#else
        printf( "define __LIBC/n" );
#endif
 
#ifndef _LIBC_REENTRANT
        printf( "Undefine _LIBC_REENTRANT/n" );
#else
        printf( "define _LIBC_REENTRANT/n" );
#endif
 
        return 0;
}


相关文章:

  • 【烈日炎炎战后端】操作系统(1.1万字)
  • for while (list each)的用法
  • 【烈日炎炎战后端】设计模式(1.1万字)
  • 【烈日炎炎战后端】 数据结构(0.7万字)
  • JavaScript学习总结——原型
  • 2的幂在约瑟夫环问题的应用
  • 【烈日炎炎战后端】MySQL理论(2.8万字)
  • Mysql5.6主从复制
  • 【烈日炎炎战后端】MySQL编程(3.6万字)
  • 【Mongodb】Master-Slave 复制
  • 解决前端文件修改后浏览器页面未更新的问题
  • 【烈日炎炎战后端】Redis(6.1万字)
  • UIScrollView视差模糊效果
  • 真正的上锁前,为何要调用preempt_disable()来关闭抢占的case【转】
  • 【烈日炎炎战后端】Linux(0.3万字)
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • AHK 中 = 和 == 等比较运算符的用法
  • EventListener原理
  • github指令
  • iOS小技巧之UIImagePickerController实现头像选择
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Laravel Telescope:优雅的应用调试工具
  • MySQL QA
  • Promise面试题2实现异步串行执行
  • Python3爬取英雄联盟英雄皮肤大图
  • Python学习之路16-使用API
  • VUE es6技巧写法(持续更新中~~~)
  • Vue2.0 实现互斥
  • Vue学习第二天
  • 笨办法学C 练习34:动态数组
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 精彩代码 vue.js
  • 前端技术周刊 2019-02-11 Serverless
  • 实习面试笔记
  • 智能网联汽车信息安全
  • 仓管云——企业云erp功能有哪些?
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • (09)Hive——CTE 公共表达式
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (动态规划)5. 最长回文子串 java解决
  • (二)WCF的Binding模型
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (三)终结任务
  • (十)T检验-第一部分
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (四)模仿学习-完成后台管理页面查询
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Project Open Day(2011.11.13)
  • .Net Remoting常用部署结构