2011-04-02 63 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)更好記錄,但仍然很容易搞砸。