我正在ext4 no ubuntu 14.04上测试inotify,当执行复制或创建操作时,我会得到以下相同的inotify事件:
cp文件newfile
在创建新文件中
在修改新文件中
关闭新文件
echo“foo”>>新文件
在创建新文件中
在修改新文件中
关闭新文件
有没有可能区分这两种情况?
我想知道执行了一个拷贝,什么是源文件和目标文件。
如果不可能用人工授精的方法,可以用其他方法吗?
谢谢你的帮助。
最佳答案
在unix中没有“拷贝”这样的东西。即使是最高级的复制文件的系统调用(sendfile和copy_file_range),最终也归结为使用中间缓冲区在两个独立文件之间复制数据。
但是您可以使用一些猜测来确定文件副本的正确程度。
假设,那
打开两个文件:A和B(无特定顺序)
a是从(in_access)中读取的
b写入(in_modify)
A和B关闭
a已打开供读取(由in_close_nowrite标识)
B已开放供写作(由in_close_write标识)
A和B之后具有相同的数据大小(stat.st_size)
注意,上面的顺序只是普通的启发式,而不是严格的规则。可能还有其他顺序不太明显的事件(例如,在打开源文件之前,在modify-in中截断或释放目标文件)。复制过程可能会断开现有的目标文件,并专门为复制创建新文件,在这种情况下,新文件必须及时地用iNosit进行观察(!)!)。由于订阅竞赛,您可能会错过一些(或全部)事件,而这些竞赛在设计上是完全无法检测到的。
您还可能由于inotify队列溢出(in_q_overflow)而大量错过事件。
inotify无法检测mmap ed文件的内存操作,mmap通常用于文件复制。所以第2步和第3步可能都不见了。
您还没有指定目标文件系统(以及是否希望在不受控制的环境中使用inotify),但请注意,某些文件系统可能不支持inotify(基于fuse和网络的文件系统往往特别有问题)。这可能取决于fuse的特定文件系统和内核版本。
创建硬链接并不能严格地限定为副本,但它可能会导致类似于这种情况的死后模式(两个文件大小相同,内容相同),因此您的应用程序应该更好地了解inode。
由于上述原因,用inotify识别拷贝太麻烦了,除非你期望得到显著的回报。您应该考虑从识别拷贝开始,使用静态分析(因为您有时会使用inotify返回到它)。
关于linux - 使用Inotify检测复制操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43790226/