Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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_File_Inode - Fatal编程技术网

C++ 如何检测已打开的文件在打开后是否已移动

C++ 如何检测已打开的文件在打开后是否已移动,c++,linux,file,inode,C++,Linux,File,Inode,正如标题所述: 我的程序打开一个文件 有东西出现并移动了那个文件。Inode应该相同,但名称不同 关闭文件,然后删除,但它不再存在 那么,如何检测它已被移动并删除正确的文件名呢 有什么想法吗?可以用来检测旧名称的更改(查找IN\u MOVE\u SELF事件)。但是,如果您的真正目标只是删除文件名,那么您可以在打开文件后立即删除(使用unlink(2))。Unix文件语义将允许您继续使用打开的文件,在关闭句柄之前,磁盘上的数据实际上不会被删除。然后,没有人能够重命名该文件。在关闭该文件之前,

正如标题所述:

  • 我的程序打开一个文件
  • 有东西出现并移动了那个文件。Inode应该相同,但名称不同
  • 关闭文件,然后删除,但它不再存在
那么,如何检测它已被移动并删除正确的文件名呢


有什么想法吗?

可以用来检测旧名称的更改(查找IN\u MOVE\u SELF事件)。但是,如果您的真正目标只是删除文件名,那么您可以在打开文件后立即删除(使用unlink(2))。Unix文件语义将允许您继续使用打开的文件,在关闭句柄之前,磁盘上的数据实际上不会被删除。然后,没有人能够重命名该文件。

在关闭该文件之前,尝试
访问(2)
该文件。如果您得到enoint,则文件已被移动。按照/proc/self/fd/$open\u file\u number/symlink使用
readlink(2)
查找新文件名

fstat
打开文件,
stat
名称,然后比较结果


但是,与任何可能的检查一样,它仍然是活泼的;在您进行任何检查之后,但在您采取行动之前,名称的含义可能会发生变化。是时候重新审视您的需求了。

取消链接的问题在于竞争条件。如果文件在取消链接之前移动或可以完成,则无骰子。然后在打开文件之前,先移动文件。没有人会知道这个新名字,你可以在最后打开并取消链接。如果这仍然不能解决你的问题,那么你将不得不更详细地描述你真正想要完成的事情。看起来这里也有一场比赛。如果access指示它没有被移动,我尝试删除它,但在这些调用之间有东西移动,我就退出luckUsing
access
不会处理名称现在指向不同文件的情况。您是否担心跨文件系统移动(复制和删除,inode未保留)和非inode文件系统(例如FAT)?