如何拦截使用 inotify 或其他访问打开的文件的文件描述符?

如何拦截使用 inotify 或其他访问打开的文件的文件描述符?

我刚刚在大学完成了操作系统课程,我想开始使用 Rust 来玩系统级程序。我正在寻找的一件事是如何拦截在文件夹中打开的文件的文件描述符,并将其指向的文件交换到新文件。我想我可以用 Rust 的一堆inotify工具和板条箱来解决这个问题,以及libc自己调用一些系统调用函数,但我在理解 Linux 虚拟文件系统方面遇到了问题。有没有一本书可以准确解释诸如命令之类的find文件如何操作以及文件的结构?我下载了 的源代码coreutils,但我很难确定 Linux 中的文件结构是什么样的。我知道索要书籍或资源违反了某些规则或其他内容,但我似乎无法找到有关内核和实用程序如何协同工作的明确资源。尽管我对使用基于 Unix 的系统非常满意,但我才刚刚开始进行开源操作系统开发。任何指导我朝正确方向发展的帮助将不胜感激。干杯!

答案1

inotify只会警告您的进程发生了一些事情,然后您可以同步远程文件、窗口内容、触发防病毒等。它不会允许进程干扰打开的文件描述符。也许您可以做的更接近的事情是创建一个虚拟文件系统:FUSE 允许您在用户进程中实现它。这样的文件系统将接收文件访问并且可以做任何你想做的事情。最好的想法可能是获取一些开源示例并对其进行分析或打开一个教程(Google FUSE 文件系统教程)。

find通常是一个使用opendirreaddir系统调用来获取每个目录内容和有关文件的一些信息(stat可能也需要)的程序,它不需要像 inotify 或 FUSE 这样的高级 API。

您应该更准确地回答“文件的结构如何”这个问题。许多系统都显示一个 API,其中文件只是字节流,应用程序可以使用该字节流执行所需操作(读、写、查找)。

如果您的问题与文件系统有关,则答案取决于文件系统。在 FAT 上,每个目录条目都指向其文件的第一个簇(一组固定长度的块),并且文件分配表指示每个簇是下一个簇。其他一些文件系统更复杂,具有指向每个范围(一个块号和多个块)的 B 树结构。看https://en.m.wikipedia.org/wiki/B-tree一本好的操作系统书籍将比这里的典型答案详细得多。 (您有一系列文章:在 Google 中了解 ext4 第 1 部分,然后是第 2 部分,……第 6 部分)

相关内容