专栏首页蓝天Linux下的strerror是否线程安全?

Linux下的strerror是否线程安全?

下列是glibc-2.14中的源代码:

 char *
  
 				strerror (errnum)
 
 int errnum;
 
 {
 
 				  char *ret = __strerror_r (errnum, NULL, 0);
 
 int saved_errno;
 
 
 
 
 
 if (__builtin_expect (ret != NULL, 1))
 
 				    return ret;
 
 				  saved_errno = errno;
 
 if (buf == NULL)
 
 				    buf = malloc (1024);
 
 				  __set_errno (saved_errno);
 
 if (buf == NULL)
 
 				    return _("Unknown error");
 
 				  return __strerror_r (errnum, buf, 1024);
 
 } 

man strerror即可看到相关说明,strerror_r是线程安全的,但不带_r的strerror是非线程安全的。

不过大部分时候strerror是安全的,因为大多数情况: if (__builtin_expect (ret != NULL, 1)) return ret; 这个地方能return出来。大多数凭空return非const字符串的都不是线程安全的,而strerror大部分系统认识的errno都是返回const字符串,所以大部分时候都是安全的。

遇到不安全的结果是返回错乱的字符串,但不会coredump,原因是buf的内存总是有效的。用户如果给一个不存在的errno,会返回 "Error %d"这种东西,就非安全。

所以如果确认给的都是合法的errno,可以认为是安全的。或者干脆 #define strerror(x) strerror_r((x),0,0),这个#define要加-D_GNU_SOURCE编译。

如果只是用当前的errno,直接用%m,但%m要直接使用系统的Xprintf,不能做二次封装,否则中途一下库函数会改变当前errno。如果封装里面用了malloc(),localtime这一类的,会改变当前errno值,使用Xprintf时值就不对了,如果重封装要先保存再恢复errno。

可以在多线程中尽情使用strerror,但最好同时记录errno,万一乱字符串,还可通过errno取得正确的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • strerror线程安全分析

    答案是NO,但它有个线程安全的版本:strerror_r。借助Linux的man,即可看到详情:

    一见
  • Linux中的tty与pts

    作者: coolentboy  发布日期: 2006-9-17    出自: http://www.linuxdiyf.com

    一见
  • curl和https,及openssl

    如果使用curl访问https(注意不是http),则会牵涉到OpenSSL,就需要注意多线程安全问题。 一是OpenSSL需要编译成多线程安全版本,二是...

    一见
  • 如何搭建基于C#和 Appium 的 Android自动测试环境

    如果想做手机端的自动化测试,Appium是首选的测试框架,因为网上使用的人多,资料丰富,支持语言多 Jave,Python,C#,Ruby,PHP,碰见问题也容...

    葡萄城控件
  • 数据蒋堂 | 性能优化是个手艺活

    本文共1400字,建议阅读8分钟。 大数据的技术本质就是高性能,性能优化也是程序员们的永恒话题。

    数据派THU
  • 如何将Python应用于数据科学工作

    假设你想开发一个能够自动检测图片内容的程序。给出图1,你希望程序识别这是一只狗。

    CDA数据分析师
  • UML 规范对一个开发团队的重要性!!!

    在团队协作过程中最常见的就是开会、开会最常用的就是图,而图中最常见的就是流程图、时序图、类图,这三个图可以清楚的描述你想解释的内容。学好类图不仅仅能帮助自己更清...

    用户5224393
  • 这个真的很有用!

    在团队协作过程中最常见的就是开会、开会最常用的就是图,而图中最常见的就是流程图、时序图、类图,这三个图可以清楚的描述你想解释的内容。学好类图不仅仅能帮助自己更清...

    谭庆波
  • 从集装箱历史看DevOps的发展进程

    什么样的技术会带来生产力的极大提升?技术含量是否与生产力提升成正比关系? ? 带着问题,我们先看一个例子:在工业革命时期,瓦特用于“改良”蒸汽机的技术,就是极大...

    ThoughtWorks
  • 学界 | DeepMind提出关系性深度强化学习:在星际争霸2任务中获得最优水平

    在星际争霸 II 学习环境中,DeepMind 的智能体在六个小游戏中达到了当前最优水平,且在四个游戏中的表现超越了大师级人类玩家。这种新型强化学习可以通过结构...

    机器之心

扫码关注云+社区

领取腾讯云代金券