如何检查打开的文件是否已被其他进程移动或删除
收藏

我有一个在linux操作系统上使用c的进程,它将数据写入一个文件。它使用open()/write()函数,我一直在想是否有另一个进程rm'd或mv'd文件。我的进程如何找到并重新创建文件?


最佳答案:

您可以使用fstat()获取有关打开文件的信息。如果st_nlink字段为零,则文件已从文件系统中删除(可能是通过移动到其他文件系统,但您无法确定)。很有可能您只剩下对该文件的引用了—尽管可能还有其他进程将其保持打开状态。直到最后一个打开文件描述符的进程最终关闭文件,磁盘空间才会释放。
如果st_nlink字段仍然为正数,那么您的文件在文件系统的某个地方仍然有一个名称。然后需要使用stat()来确定给定文件名的st_devst_ino字段是否与文件描述符中的相同字段匹配。如果该名称仍然存在并且具有相同的设备和内联号,则它是“相同的”文件(虽然内容可能已经改变)。如果存在差异,则打开的文件与按名称指定的文件不同。
请注意,如果要确保给定的名称不是指向该文件移动副本的符号链接,则在打开该文件时(确保此时它不是符号链接),以及在检查该文件时(而不是使用lstat())都必须对该文件使用stat()

公众号