1

我对在我(作为 usr1)拥有的配置文件和我在操作系统守护程序(每 5 分钟)中创建的临时文件之间突然创建的硬链接感到惊讶,以便从原始配置文件中复制。

复制回原始文件后,我使用 rename(*file2, *file1); 在 C 中,它会杀死对 config.txt.tmp 的任何跟踪

该目录在 mnt /sram 驱动器上是 root 拥有的,并且没有人对嵌入式机器具有 root 访问权限。存储介质是嵌入式 Linux 2.6.10 上的 NAND 闪存 SRAM

ls -l节目

2 config.txt       699byte date_modify  
2 config.txt.tmp   699byte date_modify

config.txt.tmp 应该被创建,从 config.txt 复制,将配置参数发送到 config.txt,然后在 5-7 个 C 行内自动删除

该目录是 root 拥有的,无法创建硬链接。

有人对低级函数中的“硬链接”创建有解释吗?我会面临竞争状况吗?或者它可能是一些用于通过闪存存储的内核代码?还是Linux中的错误?

我的代码运行了 5 年,100 台机器,最近只有 1 台机器出现了这个问题。

4

1 回答 1

1

通过执行检查文件是否实际上是硬链接

ls -i

显示 inode。

我的头顶:

  • 文件缓冲区在移动之前可能已经脏了?
  • 如果涉及分叉,那么脏缓冲区甚至可能在分叉之前就在起作用
  • 是否存在闪存“覆盖”文件系统驱动程序?也许它已经改变并包含以前没有
    想到 的优化
    • 工会
    • 奥夫斯
    • ...?

编辑

FWIW:从你的文字中,我觉得你可能正在做相反的事情:我希望你写一个 .tmp 副本,一旦一切都被刷新和同步,“原子地”(好吧,交叉手指以获得文件系统支持和订购模式)将其重命名到位。(我现在只是猜测,因为大部分图片都太模糊,无法实际继续)

另请参阅:没有 fsync() 的 rename() 是否安全?

于 2012-07-18T00:18:42.260 回答