免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5293 | 回复: 1
打印 上一主题 下一主题

请问信号处理中用什么方法代替不可重入的IO操作 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2009-11-04 17:41 |显示全部楼层

回复 #6 danielhf 的帖子

我理解所谓reentrant和non reentrant函数的区别就是函数每一次调用时是否完全一致
也就是如你列出的第2点所说,当一个函数在执行过程中被中断,并再次被调用,重头开始执行时,其行为是否会发生变化
那么如果这个函数中使用了static或者global的变量
两次调用的行为很有可能会受其影响而不一样,那么这个函数就是non reentrant的了
查了下APUE大概就是这个意思

当然,阻塞所有信号应该是可以的
因为这就不存在中断处理函数自身被中断的可能性了,也就无所谓重入了

所以要严格保证信号处理函数的安全的话
至少要保证自己的代码以及调用的库函数都没有使用static/global变量
既然printf族的函数被认为是non reentrant的话
去查看它的代码可能会发现使用到static/global变量的地方

至于调用全局方法,跟调用一个库函数,或者自己定义的函数没有本质区别
关键是看这个方法会不会使用static/global变量,我觉得这是判断是否reentrant的重要依据

ps.
个人觉得没有必要特别在意
完全、严格的reentrant的函数是没有的,因为至少errno变量是大家所共享的

论坛徽章:
0
2 [报告]
发表于 2009-11-04 19:19 |显示全部楼层

回复 #1 danielhf 的帖子

所谓reentrant和non-reentrant函数并没有十分严格的界定
printf族的函数之所以不是reentrant,我个人猜测大概是因为变长参数的引入
使得函数的实现变得复杂了,其中可能会用到static的或者是global的变量,这就不能重入了
这只是猜测,没有根据

如果实在担心,可以用read/write来读写阿

另外,最后一句话没看懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP