getrusage()可以显示进程的子进程使用的内存量。我正在创建一个从中启动几个子程序的shell。 getrusage()会报告所有这些孩子正在使用的记忆的总和,这不是我想要的。我想知道每个孩子正在使用多少内存。 getrusage()看起来像我想使用的东西,除非它不适用于单个子进程。有什么可以使用的?在C++中寻找类似getrusage()的东西
回答
也许你可以一次把一个孩子分叉一个,然后用getrusage(RUSAGE_CHILDREN...)
独立地找出每个孩子的用法。
这种方法最明显的缺点是如果孩子需要同时运行。在这种情况下,一个自定义的中介程序可以做到这一点。而不是直接执行儿童,执行一个程序:
- 叉
exec
S上的请求的程序,也许是作为命令行参数(程序及其参数)传递的nice
或time
命令 的风格
- 父母为子女执行
getrusage()
。由于只有一个,这是所期望的结果。然后使用一些机制将信息传递回主程序,也许是一个状态文件。
然后,所有需要的是让主人通过指向运行目标孩子和报告内存使用情况的中介来分离其每个孩子。
问题是要重新调整子进程的层次结构,以便调用getrusage()
的程序只有一个子进程。主程序不能,因为它有太多的孩子,并没有系统调用来获得pid的内存使用情况。
我想你也可以在/proc/<pid>/mem
中窥探,如果这是Linux或兼容。
我使用fork然后execv最初创建孩子。你是否说我可以再次使用叉子进入孩子们的内心? – 2011-04-30 04:30:52
@ z-buffer:类似的东西。我会在答案中澄清。 – wallyk 2011-04-30 04:32:11
这只会在孩子第一次创建时才起作用,对吗?我希望能够看到孩子们在任何时候都用了多少记忆。 – 2011-04-30 04:35:04
当你每个子进程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
您可以使用wait3
或wait4
,详见本其他SO线程:CPU time after the process finished。
- 1. 寻找类似缓存的东西
- 2. 寻找类似于ui的东西:在JSP中重复使用
- 3. 寻找类似DatePickerDialog但具有递归函数的东西
- 4. 寻找类似的东西,以Path.Combine浏览文件夹
- 5. 接口寻找类似Appendable或OutputStream的东西
- 6. 类似dict的东西在c
- 7. 类似的东西?
- 8. 寻找(N)步骤GUI类的东西
- 9. VS2010不断寻找东西
- 10. 在C#中列出类似于C++中的vector.reserve(n)的东西
- 11. 在C++(或C++ 11)中是否有类似于c#的东西?
- 12. 在C#中fflush()从C中有类似的东西吗?
- 13. Python:寻找列表中的东西
- 14. 东西还在寻找的jQuery 1.3
- 15. AS3 - 类似arguments.caller的东西?
- 16. 在HTML页面寻找“stock_value” - preg_match东西
- 17. 东西在Java中是(类似)参数
- 18. 寻找类似HashSet的东西,但是键值的范围有多大?
- 19. 寻找关于Flex模块化范例(或类似的东西)的pdf
- 20. 在MUnit寻找像JUnit的@Before/@After之类的东西
- 21. 寻找类似于提交完整事件来关闭加载器的东西
- 22. QTableView中类似于QTableWidget :: currentCellChanged的东西?
- 23. 类似的东西在Python回文
- 24. 我们在JavaScript中有类似C#String.Format(...)的东西吗?
- 25. 在C++中是否有类似于typeof的东西?
- 26. 在Objective-C中是否有类似于LINQ的东西?
- 27. c#寻找类似的颜色
- 28. 我正在寻找类似于drupal CCK的东西,但在Java中(在Java CMS中)?
- 29. 寻找类似笨
- 30. 寻找类似“array_and”
你可以在每个子进程中调用getrusage(RUSAGE_SELF,..)吗? – 2011-04-30 04:24:36