Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2336736
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2010-11-11 09:47:32

多数时候, 这个不重要。
少数时候,当这个区别显得重要,它就会非常重要。
下面是我在用脚本实现一个功能时,碰到的问题。

一个C 程序, 会打开一个文件, 保存其file descriptor, 然后在一个timer中周期性地读取该文件的内容。该文件的内容会动态变化。比如 /proc/stat

我在脚本程序中企图模拟出一个  /prox/stat 文件,每一秒都把 /proc/stat的内容复制到该文件, 然后作一些修改。这个案例就是我在另一篇blog中的例子。作这件事时,我曾经用下面的办法来保证修改的原子性:

cp -f /proc/stat  /prox/stat_tmp
sed -i  ...   /prox/stat_tmp
mv stat_tmp  /prox/stat

这样, 如果每次都产生一个 stat_tmp, 它会有一个不同的inode, 当stat_tmp被mv成 stat, 这个stat的inode就是stat_tmp的inode.

程序中因为保存了第一次打开的file descriptor, 所以该fd内部关联了其第一次打开时的inode, 然后它用这个fd周期性地读其内容, 却只能读取相同的内容。在另外的shell中检查其结果时,/prox/stat 的内容却是动态变化的。

这样的bug非常令人费解,很难调试,花了我好几个小时才想到是这个原因,而重定向其实是以 O_WRONLY 方式打开文件,truncate其原来的内容,该文件的inode是保持不变的。
阅读(3709) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~