我正在Ubuntu上运行一个类似于"C"的"沙盒":它接受程序并在用户"nobody"下安全运行(截获信号等)。此外,它分配内存和时间限制,并测量时间和内存使用情况。(如果你好奇的话,这是为了对测试数据上的程序进行标记的一种"在线评测机")
目前,我已经从mooshak中改编了"safeexec"模块。虽然大多数东西都工作正常,但内存使用似乎是一个问题。(它非常不准确)
现在,我尝试了here中的建议,并从/proc/pid/stat
解析了VM,现在准确性问题已经得到解决。但是,对于完成非常快的程序,它不起作用,只会返回0。
"safeexec"程序似乎是这样工作的:
fork()
出子进程- 在子进程中使用
execv()
运行所需程序 - 在父进程中监控子进程,直到子进程终止(使用
wait4
,它返回CPU使用情况,但不包括内存使用情况)
因此,解析子进程的/proc/../stat
文件(已被execv替换)
那么为什么/proc/child_pid/stat
中的VM有时等于0?
是因为execv()完成得太快,导致/proc/child_pid/stat
不可用吗?
如果是这样,是否有其他方法来获取子进程的内存使用情况?
(由于这是用于评估在时间限制下的程序,我不能承受像valgrind这样会影响性能的东西)
提前感谢。