如何检查两个文件名是否指向同一物理文件

Gio*_*Gio 8 c

我有一个程序接受两个文件名作为参数:它读取第一个文件,以创建第二个文件.如何确保程序不会覆盖第一个文件?

限制:

  • 当文件系统支持(软或硬)链接时,该方法必须继续工作
  • 文件权限是固定的,只需要第一个文件可读,第二个文件可写
  • 它最好应该是平台中立的(尽管Linux是主要目标)

Tob*_*obu 12

在linux上,打开两个文件,并fstat用来检查是否st_ino(编辑:)和st_dev相同.open将遵循符号链接.不要stat直接使用,以防止竞争条件.

  • 还要确保`st_dev`字段匹配.没有什么能阻止两个不同卷上的不同文件具有相同的inode编号. (7认同)
  • 竞争条件意味着文件状态可能在stat(2)和open(2)之间变化.你做stat,然后一些用户取消你刚刚说明的文件的链接,并将你的第二个文件链接到你即将打开的文件(2).只是一个澄清. (4认同)

小智 9

最好的办法是不要将文件名用作身份.相反,当您打开文件进行读取时,请使用操作系统支持的任何机制将其锁定.然后,当您还打开文件进行写入时,也要锁定它 - 如果锁定失败,则报告错误.