我在 Ubuntu 上用 C 语言运行一种“沙箱”:它需要一个程序,并在用户下安全地运行它nobody
(并拦截信号等)。此外,它还分配内存和时间限制,并测量时间和内存使用情况。
(如果您很好奇,这是一种“在线法官”在测试数据上标记程序)
目前我已经从mooshak改编了safeexec模块。尽管大多数事情都可以正常工作,但内存使用似乎是个问题。(这是非常不准确的)
现在我已经尝试了这里的建议并从 中解析了 VM /proc/pid/stat
,现在准确性问题已得到解决。但是,对于真正快速完成的程序,它不起作用,只会返回 0。
safeexec程序似乎是这样工作的:
- 它
fork()
是 - 在子进程中使用
execv()
以运行所需的程序 - 从父进程监视程序,直到子进程终止(使用
wait4
,这恰好返回 CPU 使用率 - 但不是内存?)
因此它解析/proc/../stat
子进程(已被 execv 替换)
那么为什么 VM in/proc/child_pid/stat
有时等于 0?
是因为 execv() 完成得太快,而且/proc/child_pid/stat
不可用吗?
如果是这样,是否有其他方法可以获取孩子的内存使用情况?
(因为这是为了在时间限制内判断程序,所以我不能承受像 valgrind 这样的性能损失)
提前致谢。