2011-04-02 62 views
1

我正在尝试编写一个大学项目的程序,但是我陷入了这个问题:程序监视程序的读/写PATH?

您将如何监控程序以了解它写入或读取哪些文件? 我希望有他们的路径名称。

为了使问题更清楚,这里有一个例子:

考虑,我们要监视程序A.EXE和A.EXE首先打开一个名为“A1”居住在同一文件夹中a.exe,然后打开另一个名为“a2”的文件。

程序必须给的“A1”和“A2”文件中的相对或绝对路径,而不管它们被打开的读/写..

如何在C++实现这一点?

编辑:是否有可能将a1和a2文件的调用转移到另一个路径? 编辑2:好吧,让我这样说:我已经将C:\ program files中的firefox.exe移动到D:\,现在当我运行firefox.exe时它不会工作因为它可以在很多文件中工作C:\ program files,firefox.exe会使用相对路径来访问文件。我打算做的是捕获firefox.exe工作文件的调用,然后将调用指向程序文件文件夹。 PLZ让我知道,如果我已经让自己清楚..

+0

你在做什么平台? – 2011-04-02 13:40:28

+0

将是伟大的,如果它同时适用于Windows和Linux.but Windows首先.. – TarunG 2011-04-02 15:01:38

回答

1

在Linux上,你可以使用'strace'输出你的应用程序执行不同的系统调用。如果你需要实现一个与strace相同类型输出的程序,一个快速实现可以包含一个简单的shell程序,它可以输出strace。否则,寻找strace代码是一个好的开始。

Sysinternals套件中的Windows'Process monitor'可以帮助你。

+0

将不会进程监视器给我只有开幕和当前“*进程*”的细节,而不是给我的文件的细节IO操作需要? – TarunG 2011-04-02 14:48:36

+0

Sysinternals工具可以显示文件操作,如其在线文档/市场营销中所述。 – 2011-04-02 17:20:15

+0

请参阅编辑部分.. – TarunG 2011-04-02 18:30:54

0

如果你想修改的参数open(2)creat(2)truncate(2),等等,那么你可以使用Linux ptrace(2)设施拦截systemcalls和执行调用之前替换文件名字符串。

ptrace(2)是黑暗的魔法,所以除非它是一门高级课程,它可能不是你的教授的意图。 (如果下一个讲座上写一个调试器像gdb(1),那么这是正是你的教授之意。)

你可以使用另一种机制,而且可能更便携,是图书馆或功能 - 你可以在库中的特定函数周围编写小包装,并通过加载环境变量LD_PRELOAD(有关影响库加载的环境变量的详细信息,请参见ld.so(8)联机帮助页),将调用您的函数而不是标准函数。

图书馆设置是灰色魔法;它比ptrace(2)更好记录,但仍然很容易搞砸。