linux - 拦截子进程文件系统事件的方法

标签 linux winapi filesystems posix hook

我有一个用 C 编写的小型命令行应用程序,它充当其他程序的包装器/启动器(想想:xargs)。该应用程序被编写为在 FreeBSD/Linux(通过 fork()/exec())和 Windows(CreateProcess())上编译。除了能够拦截、注入(inject)或以其他方式操纵子应用程序的命令行参数之外,我想知道是否有一种简单的方法来拦截子程序的文件系统事件(或者它的子程序,等等)。我主要只对读取或写入访问的文件名感兴趣,而不是所述文件的内容,并且希望拦截尽可能轻量级。

从上面谷歌搜索一些相关关键字,似乎在 Win32 中有很多方法可以做到这一点。从文件系统过滤驱动到篡改 PE 导入表头。这些看起来都不是微不足道的,也不是我可以在我的包装程序的可执行文件中独立包含的东西(例如,除了主要的可执行文件之外,大多数都需要额外的 DLL 或驱动程序文件。)另外,如果可能的话,我希望它能在 Windows XP 到 7 上工作,而不必绕过 UAC 或其他平台增量。这是我的子进程,所以我想我应该能够安全地监视它的事件:)

在 Linux 上,有 inotify(),但它只监视一般文件系统访问,而不考虑仅我的子进程/es。 FreeBSD 的 kqueue() 也是如此。这些在 SMP 情况下也会崩溃,在这种情况下,包装器的多个实例可能正在运行不同的程序,并且每个实例都需要相互区分自己的子文件系统事件。

我非常感谢 SO 社区可能必须提供的任何建议。

最佳答案

我唯一的建议是使用 strace(跟踪系统调用和信号),虽然这更像是一个调试工具,并且确实会影响被跟踪进程的性能

strace -f -e trace=file -o <output-file> <cmd-line>

-f - follow forks
-e trace=file - will output system calls related to the file-system
-o <output-file>

恕我直言 - 如果您熟悉 strace,它总是一个有用的工具。

关于linux - 拦截子进程文件系统事件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1030849/

相关文章:

c++ - 使编辑控件透明 WinAPI (win32)

在 WINAPI 中计算时钟周期给出非常不同的结果

java - Netbeans 平台 : InstalledFileLocator

ruby-on-rails - 与 Rails 应用程序一起使用的文件服务器的建议

linux - 本地文件的 Shell 脚本

linux - node.js ftdi 模块抛出错误 : libftd2xx. 所以:无法打开共享对象文件

c++ - 创建自定义窗口边框边缘在调整大小时消失

linux - 表格式 Shell 脚本

linux - socat 监听分配给特定网络接口(interface)的所有 IP

c# - 文件系统 TreeView