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

时间:2011-10-16 14:54:42

标签: c linux

我在Linux OS上使用C进程将数据写入文件。它使用open() / write()个函数,我一直想知道另一个进程是rm'd还是mv'。我的流程如何找出并重新创建文件?

2 个答案:

答案 0 :(得分:6)

您可以使用fstat()获取有关打开文件的信息。如果st_nlink字段为零,则文件已从文件系统中删除(可能是通过移动到其他文件系统,但是没有真正的方法可以确定)。有一个很好的机会你有唯一剩下的参考文件 - 虽然可能有其他进程也保持打开。在具有文件的打开文件描述符的最后一个进程最终关闭文件之前,磁盘空间不会被释放。

如果st_nlink字段仍为正数,那么您的文件在文件系统中的某处仍有一个名称。然后,您需要使用stat()来确定给定文件名的st_devst_ino字段是否与文件描述符中的相同字段匹配。如果名称仍然存在且具有相同的设备和inode编号,则它是“相同”文件(尽管内容可能已更改)。如果存在差异,则打开的文件与名称指定的文件不同。

请注意,如果您想确定给定名称不是指向已移动文件副本的符号链接,则在打开文件时必须使用lstat()(以确保它)此时不是符号链接),再次检查文件时(而不是使用stat())。

答案 1 :(得分:0)

您可以使用stat来执行此操作。

struct stat st;
if(stat("/tmp",&st) == 0)
        printf(" /tmp is present\n");
else
    /* Write code to create the file */