Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何检查打开的文件是否已被其他进程移动或删除_C_Linux - Fatal编程技术网

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

C 如何检查打开的文件是否已被其他进程移动或删除,c,linux,C,Linux,我有一个在Linux操作系统上使用C的进程,它将数据写入文件。它使用open()。我的流程如何发现并重新创建该文件 您可以使用该调用来执行此操作 struct stat st; if(stat("/tmp",&st) == 0) printf(" /tmp is present\n"); else /* Write code to create the file */ 您可以使用fstat()获取有关打开文件的信息。如果st_nlink字段为零,则文件已从文件系

我有一个在Linux操作系统上使用C的进程,它将数据写入文件。它使用
open()。我的流程如何发现并重新创建该文件

您可以使用该调用来执行此操作

struct stat st;
if(stat("/tmp",&st) == 0)
        printf(" /tmp is present\n");
else
    /* Write code to create the file */
您可以使用
fstat()
获取有关打开文件的信息。如果
st_nlink
字段为零,则文件已从文件系统中删除(可能是通过移动到其他文件系统,但您无法确定这一点)。您很有可能拥有对该文件的唯一剩余引用—尽管可能还有其他进程将其保持打开状态。直到最后一个进程(该文件具有打开的文件描述符)最终关闭该文件时,才会释放磁盘空间

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


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

您需要检查inode是否没有更改-这表示该文件已被其他文件替换。但是OP声明他只需要检查文件是否是
mv
'd of
rm
'd,因此我的回答是肯定的。问题是,如果文件是mv'd或rm'd,那么您的答案会给出一个假否定,然后在其位置创建一个新的(但不同的)文件。请注意,OP表示一个“已打开的文件”,因此您需要将inode与打开的文件描述符tanks@bdonlan中的inode进行压缩。这就是应该考虑/处理的问题。如果bdonlan描述的事情发生了,那么“并重新创建文件”可能会遇到问题。如果当前用户缺少删除替换文件所需的权限,则您无法重新创建该文件。+1我本来打算回答这个问题,但您已经介绍了所有内容。