C语言多线程中使用errno全局变量的问题

程序员面试之c语言二 宏定义是预处理指令,文本替换,在编译前进行处理。没有类型检查,直接替换文本,可能导致意料之外的错误。风险缺乏类型安全:宏没有类型检查,可能导致运行时错误。调试困难:宏在预处理阶段展开,调试信息可能不清晰。副作用:宏替换时可能出现副作用,如表达式被多次计算。函数定义是编译时处理的代码块,有类型检查和更好的调试支持。性能要求:在性能敏感的代码中,宏定义避免了函数调用的开销(但现代编译器通常会对内联函数做优化)。常量表达式:对于编译时常量(如),宏定义更为合适。条件编译。 阅读详情

        在C语言中,不管理Unix/Linux还是Windows下,每次系统调用或库函数调用后,如果判断返回值不对,需要调用errno全局变量来判断具体错误。既然errno是全局变量,那么如果在多线程函数中它不会被别的线程充掉吗?显然不是,通过查看相关定义,仅以Unix/Linux为例,可以得出两个结论:
1. errno是per-thread的,也就是说errno定义和存储是对于线程而言的,与别的线程毫无关系;
2. errno调用最终是一个调用,每使用一次都会调用一次函数。
与错误处理相关的两个函数perror,strerror内部调用的也都是线程存储的变量,看看FreeBSD中对strerror的定义:
char*
strerror(int err)
{
   static char msg[32];
   int i;
   for(i=0;errtab[i].msg !=NULL;i++)
    if(errtab[i].err == err)
       return (errtab[i].msg);
   sprintf(msg,"unknown error (%d)",err);
}

errtab数组是定义的本线程的全局变量。

Linux中实现的细节可参看以下文章,讲得比较透彻:
https://blog.youkuaiyun.com/weixin_35695879/article/details/89530417

C语言中errno错误码定义及使用 C语言中errno错误码定义及使用 在 C 语言中,errno是一个用于标识程序运行时错误的全局变量。当系统调用或库函数执行失败时,通常会设置errno以指示具体的错误类型。 阅读详情

相关推荐

C 语言_系统函数_errno.h深度解析

C 语言_系统函数_errno.h深度解析

renhl252的专栏 931

嵌入式C编程之错误处理(附代码例子)!

作者:clover-toeic原文:https://www.cnblogs.com/clover-toeic/p/3919857.html前言本文主要总结嵌入式系统C语言编程中,主要的错...

1014

errno的正确使用原则

本文深入解析了errno机制的正确使用原则,首先介绍了其历史演变和核心概念,重点阐述了errno从全局变量到线程局部变量的发展过程。文章分析了errno的设计理念,包括成功调用不重置errno、仅在函数失败后检查等关键原则,并解释了这些设计背后的性能考量和信息保留权衡。通过系统调用与库函数的对比,说明了errno在多线程环境下的安全机制。最后指出,尽管现代编程语言提供了更丰富的错误处理机制,errno因其简洁高效仍被广泛使用,是系统编程中不可或缺的基础设施。

weixin_42108533的博客 1155

C语言文件补充笔记4:打印出错信息error

perror的使用

weixin_44457930的博客 950

别急着做AI:FDE教你识别真需求,让AI真正落地

人工智能项目在落地过程中,经常出现业务方高喊“我们要做AI”,却说不清具体应用场景的现象。判断一个需求是否值得用AI实现,不能只看技术流行度,而要从问题出现频率、当前替代方案以及可量化业务价值三个维度展开验证。同时需要冷静比较规则引擎与大模型的边界:不是所有语义任务都要靠生成式模型,稳定、可解释且低成本的传统方案往往更具工程性价比。数据闭环也至关重要,缺乏历史样本与反馈回流路径的项目,很难在真实环境中持续优化。针对智能客服、合同审查或企业知识库等典型场景,可借助人机协同与最小代价的用户验证,逐步筛除伪需求,

weixin_42624889的博客 342

蓝桥杯单片机学习13——NE555方波发生器&频率测量

NE555详解、引脚图介绍、原理图及工作原理讲解、方波产生的原理、定时器测量频率的原理及使用方法、代码实现

weixin_67907028的博客 1万+

C/C++ errno的处理及多线程安全问题

在 C 语言中,对于存放错误码的全局变量 errno,相信大家都不陌生。为防止和正常的返回值混淆,系统调用一般并不直接返回错误码,而是将错误码(是一个整数值,不同的值代表不同的含义)存入一个名为 errno 的全局变量中,errno 不同数值所代表的错误消息定义在 <errno.h> 文件中。如果一个系统调用或库函数调用失败,可以通过读出 errno 的值来确定问题所在,推测程序出错的...

LU_ZHAO的博客 2425

57. SAP UI5 应用基于 OData 注解的 Smart Field 使用方法学习

所谓 SAP UI5 Smart Field,顾名思义,是一类比较`智能`的控件,这类控件同 SAP UI5 传统的控件不同,会根据 SAP UI5 应用程序连接的 OData 服务中元数据里提供的注解(`annotations`),在运行时动态生成底层的 SAP UI5 控件。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2772

c++全局变量怎么定义_C errno全局变量是否是线程安全的

在使用多线程时,遇到了一个问题:线程例程中如果需要使用errno全局变量,如何保证errno的线程安全性?例如一个简单的线程池代码:for关于C中错误处理的问题,可以参考Error Handling in C programs,简单的说很多系统调用只会返回成功或者失败,具体失败的原因会设置全局变量errno供调用方自己读取,所以引发了多线程里errno线程安全的问题。如何解决这个问题?毕竟设置er...

weixin_39974223的博客 325

BiSeNet:面向实时语义分割的双边网络

BiSeNet 系列重新定义了实时语义分割的范式“不要在速度和精度之间妥协——用架构创新,两者兼得。V1:提出双边解耦思想,启发后续大量工作;V2:通过极致轻量化,证明小模型也能高精度;V3(工业版):推动端侧 AI 落地,成为行业标准之一。如今,BiSeNet 已成为嵌入式视觉系统的默认选择,其设计理念(解耦、轻量、融合)被广泛应用于目标检测、姿态估计等领域。

浩瀚之水的专栏 268

机器学习实战7-基于机器学习算法预测相亲成功率

大家好,我是微学AI,今天给大家介绍一下机器学习实战7-基于机器学习算法预测相亲成功率,随着社会的发展,大家都忙于事业,对自己的终身大事就耽搁了,相亲是一种传统的寻找伴侣的方式,随着时代的发展,相亲的方式也在不断地改变。在这个过程中,了解相亲双方的信息以及预测相亲是否成功变得越来越重要。本文将介绍如何使用随机森林算法对相亲成功进行预测,通过分析男女双方的房子、车子、长相、家庭条件、父母情况、生活习惯、学历、性格、兴趣等因素,来预测相亲是否成功。

微学AI的博客 3035

系统编程——线程

线程简要概述: 1.编译连接的时候使用 -pthread 2.LWP:是线程号,标识线程身份,交给CPU用的,划分时间轮片 线程ID:是进程对自己内部线程加以区别的标识。两个进程中,线程号允许相同 typedef unsigned long int pthread_t; 1.pthread_create() 1.int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_r...

k7k74439的博客 1321

PCIe(二) —— 配置空间

好了,这一篇我们把配置空间的结构,分配和访问,都大概总结了一遍,并且还介绍了它们的头部字段和这些字段的意义,包括BAR和消息路由的原理。之后,如果有时间,我们会继续来探索PCIe的数据报文的结构和传输等等。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1768

errno完全指南:C语言错误处理的7个经典坑与防御性编程技巧

本文深入剖析C语言错误处理中errno的7个经典陷阱,包括其非全局变量本质、成功不清零、多线程竞态、信号处理风险及库函数行为差异等。文章提供了清零检查、保存恢复、使用strerror_r、goto统一清理及重启EINTR调用等防御性编程技巧,并建议构建自定义错误框架以提升代码健壮性。

192

Avalonia+ReactiveUI跨平台路由:从零到舞者,你的UI也能跨界起舞?

至此,你已掌握了Avalonia+ReactiveUI的跨平台路由精髓!你的应用现在能够优雅地在各个界面间穿梭,就像是在不同星球间跳跃的宇宙飞船。无论是初探跨平台开发的新手,还是经验丰富的老船长,这段旅程都能让你的UI编排技能更上一层楼。现在,是时候让世界见证你的跨平台魔术了!💫记住,每一次实践都是向着完美编舞迈进的一步,勇敢地在你的项目中尝试吧!如果在航行中遇到风暴,别忘了回来看看这篇指南,或者在评论区抛出你的救生圈,我们一起解决!🌊。

java专栏 1535

BEV和OCC学习-4:数据准备生成pkl文件(NuSences)

info[‘cam_instances’][‘CAM_XXX’][i][‘bbox_3d’]:长度为 7 的列表,以 (x, y, z, l, h, w, yaw) 的顺序表示实例的 3D 边界框。info[‘cam_instances’][‘CAM_XXX’][i][‘bbox’]:2D 边界框标注(3D 框投影的矩形框),顺序为 [x1, y1, x2, y2] 的列表。info[‘cam_instances’][‘CAM_XXX’][i][‘attr_label’]:实例的属性标签。

zfjBIT的专栏 1701

c语言全局变量副作用,errno全局变量及使用细则,C语言errno全局变量完全攻略

在 C 语言中,对于存放错误码的全局变量 errno,相信大家都不陌生。为防止和正常的返回值混淆,系统调用一般并不直接返回错误码,而是将错误码(是一个整数值,不同的值代表不同的含义)存入一个名为 errno 的全局变量中,errno 不同数值所代表的错误消息定义在 文件中。如果一个系统调用或库函数调用失败,可以通过读出 errno 的值来确定问题所在,推测程序出错的原因,这也是调试程序的一个重要...

weixin_35060159的博客 1105

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

c 全局变量多线程调用_C errno全局变量是否是线程安全的

在使用多线程时,遇到了一个问题:线程例程中如果需要使用errno全局变量,如何保证errno的线程安全性?例如一个简单的线程池代码:for(int i=0;i<THREADNUM;i++){ pthread_create(&pid,NULL,start_routine,NULL); } while(1){ connfd = accept(listenfd,(stru...

weixin_42522626的博客 566

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

linux下 C语言erron,linux中c语言errno的使用

在linux中使用c语言编程时,errno是个很有用的动动。他可以把最后一次调用c的方法的错误代码保留。但是如果最后一次成功的调用c的方法,errno不会改变。因此,只有在c语言函数返回值异常时,再检测errno。errno会返回一个数字,每个数字代表一个错误类型。详细的可以查看头文件。/usr/include/asm/errno.h如何把errno的数字转换成相应的文字说明?方式一:可以使用st...

weixin_39985820的博客 503

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C库 —— <errno.h>

库的各个功能和用法,并提供了实际应用示例和图表描述,帮助读者深入理解和掌握这些功能。变量、标准错误码和错误处理函数,程序员可以有效地检测和处理运行时错误,编写出更健壮和可靠的代码。头文件提供了一种标准的错误报告机制,通过定义错误码和相关宏来指示和处理运行时错误。在上面的示例中,尝试除以零会导致数学库设置相应的异常标志,程序检测并输出对应的错误消息。库的功能和用法,我们可以使用图表进行描述。在上面的示例中,尝试创建和连接套接字时可能会失败,程序根据。库的各个方面,包括其功能、用法以及在实际编程中的应用。

新华编程特战队 2394

C语言中的错误处理: `errno` 与 `perror` 的使用

errnoperror在C语言中,errno和perror是处理错误的强大工具。通过errno我们可以捕获到发生的具体错误,而perror则提供了一种简便的方式来输出错误信息。理解和熟练掌握errno和perror的使用,对于编写健壮且易于调试的程序至关重要。errno用于存储最近一次失败的错误代码。perror用于输出与errno相关的错误信息。在多种文件操作、内存分配、系统调用等错误处理中,errno和perror提供了有效的错误反馈机制。通过结合使用errno和perror。

2401_82808034的博客 1684

linux中errono的作用模式,linux中c语言errno的使用

在linux中使用c语言编程时,errno是个很有用的动动。他可以把最后一次调用c的方法的错误代码保留。但是如果最后一次成功的调用c的方法,errno不会改变。因此,只有在c语言函数返回值异常时,再检测errno。errno会返回一个数字,每个数字代表一个错误类型。详细的可以查看头文件。/usr/include/asm/errno.h如何把errno的数字转换成相应的文字说明?方式一:可以使用st...

weixin_28692867的博客 597

c语言错误代码2008,errno | C语言errno详细说明: 记录最后的错误代码

errno用于保存最后的错误代码. 它是一个宏,已扩展为int类型的数据(在单线程程序中可以视为全局变量),并且当前程序具有读取和写入权限. 错误代码的概念将在操作过程中产生各种错误. 我们可以为每种错误类型分配一个唯一的编号,就像为班级中的学生分配一个学生编号一样. 在C语言中,我们称之为错误代码.错误代码只是一个数字,没有其他结构. 要获取特定的错误信息,通常有两种选择:头文件中有一个errn...

weixin_30070339的博客 988

关掉c语言的错误提示,详解C语言中的错误报告errno与其相关应用方法

C语言标准库中的错误报告用法有三种形式。1、errnoerrno在头文件中定义,如下#ifndef errnoextern int errno;#endif外部变量errno保存库程序中实现定义的错误码,通常被定义为errno.h中以E开头的宏,所有错误码都是正整数,如下例子# define EDOM 33 /* Math argument out of domain of function. ...

weixin_42366095的博客 892

linux中c语言errno的使用

在linux中使用c语言编程时,errno是个很有用的动动。他可以把最后一次调用c的方法的错误代码保留。但是如果最后一次成功的调用c的方法,errno不会改变。因此,只有在c语言函数返回值异常时,再检测errno。    errno会返回一个数字,每个数字代表一个错误类型。详细的可以查看头文件。/usr/include/asm/errno.h    如何把errno的数字转换成相应的文字说明?

shengxiaweizhi的专栏 5320

Day 68:errno使用误区

本文详细讲解了C语言中errno的错误处理机制。主要内容包括:1) errno的定义和使用流程,强调只有在函数失败时才有效;2) 典型陷阱,如忽略返回值检查、成功调用后访问errno、多线程问题等;3) 最佳实践,如及时保存错误码、确认线程安全等;4) 错误与正确代码示例对比;5) 底层实现原理补充。文章指出,正确使用errno是编写健壮C程序的关键,需严格遵循检查返回值后再处理errno的原则,特别注意多线程环境和头文件包含问题。

blog.boringhex.top 1011
上一篇: IPV4地址和子网理解
下一篇: VMWare下CentOS7无法启动网络
ComputerInBook
博客等级 码龄19年 1168粉丝 464原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值