免费注册 查看新帖 |

Chinaunix

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

多进程/线程忘同一个文件里写日志的时候,如何保证不混淆? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-13 10:34 |只看该作者 |倒序浏览
本帖最后由 unistd 于 2010-04-13 11:14 编辑

突然想起一个问题来,就是好多个进程或者线程同时往一个日志文件里写东西,会不会发生第一个进程写了一条日志的一半,另一个进程也开始往日志里写,,造成整个日志混杂在一起。
UNIX/Linux是如何解决这个问题的? O_APPEND能管用吗?我觉得光把游标定位到文件末尾还不行,还得等上次写人完成后,或者把末尾向后移动上次写入的字节数才行。。

论坛徽章:
0
2 [报告]
发表于 2010-04-13 13:20 |只看该作者
各个进程操作文件的时候都加上可阻塞的写锁

论坛徽章:
0
3 [报告]
发表于 2010-04-13 13:25 |只看该作者
用信号机制或锁可以解决

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-04-13 13:53 |只看该作者
实际生产中 APPEND 就够用了。
加锁绝对是坏主意。

如果真的有加锁的需求,还不如对日志队列(可以用环形 buffer 或者链表等实现)加锁,然后只有一个日志线程。

论坛徽章:
0
5 [报告]
发表于 2010-04-13 15:03 |只看该作者
UNIX环境高级编程(第2版) 第3章3.11节说的很清楚,O_APPEND可以保证原子操作

论坛徽章:
0
6 [报告]
发表于 2010-04-13 15:39 |只看该作者
pread/pwrite也可以对文件的某一位置读写的一致性访问。。

论坛徽章:
0
7 [报告]
发表于 2010-04-13 17:16 |只看该作者
APPEND 是不是指"a+"打开呢?
我看有些程序记日志的程序也没有上锁,就直接fopen("name,"a+");
也是多线程的

论坛徽章:
0
8 [报告]
发表于 2010-04-15 13:44 |只看该作者
我是加锁了

论坛徽章:
0
9 [报告]
发表于 2010-04-15 13:50 |只看该作者
应该另外有一个线程写log,服务线程通过消息队列发送信息到log线程。

论坛徽章:
0
10 [报告]
发表于 2010-04-15 13:52 |只看该作者
那就太麻烦了吧,ls的在这么用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP