【问题标题】:Memory usage by a child process, fork and exec子进程、fork 和 exec 的内存使用情况
【发布时间】:2016-03-18 19:55:01
【问题描述】:

在调用 fork 和 exec 后如何测量子进程使用的内存?基本上我希望能够编写对应于以下的代码

if (!fork()) {

    // run child process
    exec();
} else {

    while (child active) {
        print memory used by child
    }
}

这里有两件事我不知道,如何查看子进程是否已经运行完毕?我是否必须在这里使用某种进程级别的互斥?如果是,那么我可以使用什么结构?我可以只使用操作系统文件系统吗?

我还在此链接Differences between fork and exec 上查看答案,在第 8 段中,作者说当进程调用 fork 而不调用 exec 时,写时复制很有用。但是在父调用fork而不调用exec的情况下,这不是更真实吗?当父调用 exec 时,子的虚拟地址空间被清除并替换为新程序加载到内存中产生的虚拟地址空间正确吗?

谢谢!

【问题讨论】:

  • 只使用 C 或 C++ 标签;它们是不同的语言。 fork 教程应该提到wait,你用来判断你的孩子是否已经死亡的函数。检查子进程的已用内存与检查任何其他进程的内存相同(例如/proc
  • 谢谢!我不知道 /proc 目录。是否有阻止方法来检查孩子是否已经死亡?去掉了标签!我打算使用 C++ 标记,但不小心添加了两者...
  • 使用WNOHANG 参数。见man 2 wait
  • 在某些情况下进行非阻塞检查的另一种方法是:kill(child_pid,0) 并查找 ESRCH 错误
  • 另外如何检查proc目录中的内存使用情况?

标签: c++ linux kernel fork


【解决方案1】:

关于上述我显然无法回复的评论链,因为我没有 50 个代表:

fork在parent中成功的返回值为child的PID。您可能应该保存返回值,以便
1。等待正确的孩子(如果你有多个),
2。看看 fork 是否失败(在这种情况下,您可能不想在孩子退出之前循环)。

您还可以使用信号来确定孩子何时死亡,而不是使用 WNOHANG 选项不断尝试等待。该进程将在终止(或停止)时将 SIGCHLD 发送给父进程,如果它死了,那么您可以使用 waitpid 等待它并停止循环。见:
男人 7 信号
man 2 sigaction
了解更多信息。

关于内存使用,您似乎需要 /proc/[pid]/statm 或 /proc/[pid]/stat。

man 5 proc 将为您提供有关这些文件中内容的所有信息。

【讨论】:

    猜你喜欢
    • 2017-07-29
    • 2010-10-19
    • 2021-11-13
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多