免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-04 17:41 |显示全部楼层 |倒序浏览
20可用积分
在信号处理中,所有人都提到要使用可重入的函数,去掉不可重入的操作以后程序即正常,但奇怪的是没有人关心程序原来的逻辑怎么办?

我在信号处理中需要进行字符串的格式化,还有写系统日志,但是看起来printf, sprintf, syslog是不能用的,printf虽然无关紧要, 但是我该如何安全地格式化字符串和写日志呢?

sprintf和syslog有什么方法可以替代,或者程序有什么改变可以实现同样的功能吗?
还有在信号处理中调用全局对象的方法也会有总是吗?

谢谢

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

你的意思是说没有证据可以说明printf是不可重入的?但我有听说使用printf后程序工作不正常的例子,其实我也不确定,依据APUE中的说法,还是不安全的。

我的问题是希望在信号处理函数中使用sprintf来格式化字串,或者syslog来记录一些信息(假设printf和sprintf有着同样的属性)

在网上找这个问题的时候,都是说把相关的printf去掉,静态变量去掉程序就不出问题了,但是我最想知道的是以前的程序逻辑怎么办?是用什么替代方法实现的?read/write只能代替printf, 但字符串怎么办?

最后一句话是输入法的问题, 调用全局对象方法会怎样? 如下

  1. static Object obj;
  2. bool flag = false;

  3. void signal_handler(int num) {
  4.     obj.func();
  5.     flag = true;
  6. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2009-11-06 11:46 |显示全部楼层
原帖由 emmoblin 于 2009-11-5 12:02 发表
要将非线程安全的函数改为线程安全的,则只需要修改函数的实现部分。一般通过加入同步机制以保护共享的资源,使之不会被几个进程同时访问。

参考:
http://www.yuanma.org/data/2008/1024/article_3260.ht ...



1.明显同步机制只能保证线程安全,而不能保证可重入,因为那要修改接口,而我们不可能修改任何接口。
2. 其实真正的问题在于,信号处理程序和产生信号的代码在同一个线程当中,当一个不可重入的函数在执行中途被打断,而信号处理过程中又用到这个函数的情况下会有错误,如果可以保证在使用不可重入的函数时不产生任何信号,也许就没事了?
3. 我读了sysvinit的代码,它在调用syslog的时候block了所有的信号,也许这是一个办法么?没有验证过

论坛徽章:
0
4 [报告]
发表于 2009-11-09 12:33 |显示全部楼层
这个分数怎么分配,我不会,也没有什么按钮或者链接,怎么给分呐?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP