0

我想跟踪对特定文件的写入,所以我想我可以这样做:

我在 上创建一个探针do_sys_open,如果filename参数与我正在寻找的模式匹配,我使用触发器来启用一个返回探针,该探针会获取返回的文件描述符 id(它是$retval)。这个返回探针将对 有一个过滤器,common_pid因为我只对刚刚打开我要监视的调用fd返回的 s感兴趣。返回探针采用并启用另一个探针,并在 和 上使用过滤器。我希望这样我就可以只跟踪我正在监视的一个文件上的操作。do_sys_openfilenamefdsys_writecommon_pidfdwrite

问题是这不适用于多线程进程。如果一个进程同时调用open两次(使用两个线程),上述机制可能会失败。现在我正在尝试找出一种方法来在入口do_sys_open和返回探测之间建立这种关联do_sys_open,我会很高兴有任何建议。

PS:我不确定这个问题是属于 stackoverflow 还是 unix & linux。

4

1 回答 1

0

你的方法是错误的。

首先,文件描述符编号是每个进程的,因此您会自动捕获几乎任何使用此类 fd 编号写入任何内容的人,这可能会或可能不会导致写入您感兴趣的文件。

此外,堆栈中的 sys_write 太高,无法捕获所有合法写入者。

通常,您会查找您感兴趣的文件的 inode 并根据相应的 write func 进行过滤。

但是,“监视对文件的写入”仍然有些模棱两可,因为不清楚如果有人要取消原始名称的链接并使用该名称创建一个新文件,您希望发生什么。如果你想处理,你确实最好在打开的某个地方捕获线程,查看查找了哪些 inode 并将它们添加到你的原语中,以便你知道监视它。

无论如何,基于 fd 的监控从根本上被打破了。

于 2016-01-27T16:05:18.387 回答