多数时候, 这个不重要。
少数时候,当这个区别显得重要,它就会非常重要。
下面是我在用脚本实现一个功能时,碰到的问题。
一个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是保持不变的。
阅读(3768) | 评论(0) | 转发(0) |