gpt4 book ai didi

filesystems - 观察文件系统 read() I/O 进程(和子进程)的最佳方式?

转载 作者:行者123 更新时间:2023-12-01 07:48:55 25 4
gpt4 key购买 nike

我想开发一个像这样工作的命令行程序:

myprogram/c [some_executable_here]

它启动了用户指定的命令并“监视”了读取 I/O 的进程(和任何子进程),当该程序退出时,打印被“读取”的文件列表(最终导致 read()系统调用)。

我最初的实现操作系统是 Windows,但我也想在 Linux 上做同样的事情。

到目前为止,我所见过的所有 FileSystem 类似 watch 的 API 都是针对查看目录(或单个文件),而不是进程,所以我不确定最好的方法是什么。

编辑:我正在寻找有关如何最终在 Windows 和 Linux 上执行此操作(或至少指向我可以遵循的 API 的指针)的代码示例。

同样需要明确的是,它不能使用某些系统级工具中的 OpendFilesView、procmon 或 grepping 字符串等方法,这些方法无法从执行的开始和结束时通过 ID(和任何子进程)明确识别进程; IOW 通过搜索“foo.exe”并得到错误的结果,不会涉及任何时间问题和误报的可能性。

最佳答案

在 Linux 上,我肯定会使用 strace ——它简单而强大。例如。:

$ strace -o/tmp/blah -f -eopen,read bash -c "cat ciao.txt"

运行请求的命令(包括它产生的子进程,由于 -f )并且还留在 /tmp/blah (在我的例子中为 120 行)详细说明这些进程进行的所有打开和读取调用及其结果。

之后您确实需要进行一些处理才能根据需要提取成功读取的文件集;例如,使用 Python,您可以执行以下操作:
import re

linere = re.compile(r'^(\d+)\s+(\w+)\(([^)]+)\)\s+\=\s*(.*)$')

def main():
openfiles = dict()
filesread = set()
with open('/tmp/blah') as f:
for line in f:
mo = linere.match(line)
if mo is None:
print "Unmatched line %r" % line
pid, command, args, results = mo.groups()
if command == 'open':
fn = args.split(',', 1)[0].strip('"')
fd = results.split(' ', 1)[0]
openfiles[fd] = fn
elif command == 'read':
if results != '0':
fd = args.split(',', 1)[0]
filesread.add(openfiles[fd])
else:
print "Unknown command %r" % command
print sorted(filesread)

这有点过于简单化(您需要查看其他一些系统调用,例如 dup &c),但我希望,显示了所需工作的要点。在我的示例中,这会发出:
['/lib/libc.so.6', '/lib/libdl.so.2', '/lib/libncurses.so.5',
'/proc/meminfo', '/proc/sys/kernel/ngroups_max',
'/usr/share/locale/locale.alias', 'ciao.txt']

所以它也算作“读取”那些为获取动态库而完成的操作,而不仅仅是“数据文件”......在系统调用级别,几乎没有区别。我想你可以过滤掉非数据文件,如果你需要的话。

我找 strace如此方便,如果我的任务是在 Windows 上做同样的工作,我的第一次尝试就是去 StraceNT -- 不是 100% 兼容,当然底层系统调用名称 &c 不同,但我认为我可以在我的 Python 代码中解释这些差异(准备和执行 strace 命令,并对结果进行后处理)。

不幸的是,据我所知,其他一些 Unix 系统只有在您是 root( super 用户)时才提供这种功能——例如在 Mac OS X 上,您需要通过 sudo为了执行诸如 dtrace 之类的跟踪实用程序和 dtruss ;我不知道 strace 的直接端口到 Mac,也没有其他方式在没有 root 权限的情况下执行此类任务。

关于filesystems - 观察文件系统 read() I/O 进程(和子进程)的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1439586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com