2011-04-30 66 views
0

getrusage()可以顯示進程的子進程使用的內存量。我正在創建一個從中啓動幾個子程序的shell。 getrusage()會報告所有這些孩子正在使用的記憶的總和,這不是我想要的。我想知道每個孩子正在使用多少內存。 getrusage()看起來像我想使用的東西,除非它不適用於單個子進程。有什麼可以使用的?在C++中尋找類似getrusage()的東西

+0

你可以在每個子進程中調用getrusage(RUSAGE_SELF,..)嗎? – 2011-04-30 04:24:36

回答

1

也許你可以一次把一個孩子分叉一個,然後用getrusage(RUSAGE_CHILDREN...)獨立地找出每個孩子的用法。

這種方法最明顯的缺點是如果孩子需要同時運行。在這種情況下,一個自定義的中介程序可以做到這一點。而不是直接執行兒童,執行一個程序:

  • exec S上的請求的程序,也許是作爲命令行參數(程序及其參數)傳遞的nicetime命令
  • 的風格
  • 父母爲子女執行getrusage()。由於只有一個,這是所期望的結果。然後使用一些機制將信息傳遞迴主程序,也許是一個狀態文件。

然後,所有需要的是讓主人通過指向運行目標孩子和報告內存使用情況的中介來分離其每個孩子。

問題是要重新調整子進程的層次結構,以便調用getrusage()的程序只有一個子進程。主程序不能,因爲它有太多的孩子,並沒有系統調用來獲得pid的內存使用情況。

我想你也可以在/proc/<pid>/mem中窺探,如果這是Linux或兼容。

+0

我使用fork然後execv最初創建孩子。你是否說我可以再次使用叉子進入孩子們的內心? – 2011-04-30 04:30:52

+0

@ z-buffer:類似的東西。我會在答案中澄清。 – wallyk 2011-04-30 04:32:11

+0

這隻會在孩子第一次創建時才起作用,對嗎?我希望能夠看到孩子們在任何時候都用了多少記憶。 – 2011-04-30 04:35:04

0

當你每個子進程fork()時,父進程得到PID。您可以使用它來查詢/proc文件系統,特別是/proc/{pid}/status(可能還有其他文件系統,具體取決於您所使用的具體指標)。

這會給你的各種信息,包括:

VmSize: 2788 kB 
VmLck:  0 kB 
VmRSS:  1280 kB 
VmData:  252 kB 
VmStk:  16 kB 
VmExe:  268 kB 
VmLib:  2132 kB 
相關問題