2011-04-30 67 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 
相关问题