c - 子进程的内存使用情况?

标签 c linux memory-management sandbox

我在 Ubuntu 上用 C 语言运行一种“沙箱”:它需要一个程序,并在用户 nobody 下安全地运行它(并拦截信号等)。此外,它还分配内存和时间限制,并测量时间和内存使用情况。
(如果你好奇,这是一种“在线法官”在测试数据上标记程序)

目前我已经从mooshak 改编了safeexec 模块。 .虽然大多数事情都可以正常工作,但内存使用似乎是个问题。 (这是非常不准确的)

现在我已经尝试了建议 here并从/proc/pid/stat解析VM,现在精度问题已修复。然而,对于真正快速完成的程序来说,它不起作用,只会返回 0。

safeexec 程序似乎是这样工作的:

  1. fork()
  2. 在子进程中使用execv()来运行想要的程序
  3. 从父进程监视程序,直到子进程终止(使用 wait4,这恰好返回 CPU 使用率 - 但不是内存?)
    所以它解析子进程的/proc/../stat(已经被execv取代)

那么为什么 /proc/child_pid/stat 中的 VM 有时等于 0?
是不是因为 execv() 完成得太快,/proc/child_pid/stat 不可用?
如果是这样,是否有某种其他方式来获取 child 的内存使用情况?
(因为这是为了在时间限制下判断程序,所以我不能承受像 valgrind 这样的性能损失)

提前致谢。

最佳答案

您能否安排子进程使用您自己的 malloc() 等版本,并记录 HWM 内存使用情况(也许使用在 atexit()< 注册的处理程序)?也许您会使用 LD_PRELOAD 来加载您的内存管理库。这对庞大的静态数组或庞大的自动数组没有帮助。


Hmm, sounds interesting. Any way to track the static/automatic arrays, though?

可以使用“大小”命令分析静态内存 - 或多或少。

自动数组是个问题 - 我不确定您如何处理这些问题。您的内存分配代码可以查看调用时使用了多少堆栈(查看局部变量的地址)。但是不能保证在使用最大数量的本地数组时会分配内存,因此它最多只能提供一个粗略的衡量标准。

另一个想法:也许您可以使用调试器技术 - ptrace() 系统调用 - 来控制子进程,特别是将其保持足够长的时间以便能够收集来自 /proc/... 的内存使用统计信息。

关于c - 子进程的内存使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/743955/

相关文章:

iphone - 从NSMutableArray返回的自动释放对象

android - 向 Android 平板电脑添加驱动程序

c - 如何在 O(1) 的数组中查找字符串

c - linux中的信号量操作,收到SIGSEGV和segmentation fault,哪一部分出错了?

python - 为什么计算路径大小的结果与使用 du 计算相同路径的结果不同

linux - 从 Docker 容器内部运行 dnsmasq 作为 DHCP 服务器

c# - 使用 Entity Framework 6 的初始负载和性能问题

ios - 如何通过延迟 iOS 上的 block 调用来避免保留周期

c - 无需重新编译 Debian 内核即可调试新的系统调用

c++ - openmp 并行部分基准