如何在C中完成进程后跟踪子进程使用的内存

时间:2016-06-25 15:27:08

标签: c linux process

我有一个进程使用execve(2)系统调用执行可执行程序的子进程 父进程使用wait4(2)系统调用等待孩子完成 我需要知道由子进程运行的应用程序使用的时间和内存 我使用了wait4(2)系统调用返回的(rusage)对象来获取我想要的时间值,但经过一些研究后我发现应用程序使用的内存不能通过相同的(rusage)对象实现,因为它变得不是现在这几天得到支持

一种方法是使用/ proc伪文件系统并解析目录/ proc / [pid]中的状态或statm文件
假设我想解析/ proc / [pid] / status
我在这个文件中需要的是字段vmdata,它指定KB中数据使用的内存


当我在子进程完成之前读取文件时,字段vmdata没有显示“它从文件中丢失!!”显然这个过程还没完成!!所以我无法准确确定用于孔工作的存储器

当我在子进程完成后读取文件时,目录/ proc / [pid]将被删除!我建议当流程完成后,流程数据将被释放

请 !!任何想法来解决这个问题或其他方式的想法?
谢谢...

1 个答案:

答案 0 :(得分:2)

VmData字段似乎仅适用于正在运行的进程。我不知道你为什么决定不这样做。只需运行grep VmData /proc/$$/status,您就会看到当前的shell进程。

您的问题中有三个有趣的时间点。第一个是您的子进程正在运行。第二个是它不再运行,而是作为僵尸存在,第三个是在你收获它之后,它就不再存在了。你好像错过了第二点。

如果您想要在僵尸状态下捕捉您的进程(即 - 它已经退出但尚未收到),您将需要找到一种方法来通知它已完成但未调用wait ,这将使它消失。我推荐的方法是注册一个SIGCHLD处理程序。当您的流程存在时,它将被调用,但不会将其从系统中删除。在那个时间点,/proc/pid/status仍然存在。

不幸的是,僵尸进程不存在VmData。您可以选择定期对VmData进行采样,或者在即将终止时停止该过程,但在实践中尚未这样做。

有一种无竞争方法可以做到这一点,但不幸的是,它需要使用有些黑魔法ptrace系统调用。有关如何使用ptrace的完整说明超出了本答案的范围。但简而言之,在调用execve之前,您的子进程会使用ptrace参数调用PTRACE_TRACEME。然后,您的父进程将成为您的子进程的调试器。只要您的子进程即将执行某些特殊操作,就会通过wait收到通知。

这需要一些玩电话,但这可以让你知道你的孩子什么时候退出,但还没有真正这样做。