存储器使用的一个孩子的过程?
-
09-09-2019 - |
题
我运行了一种"沙箱"C Ubuntu:它需要一个程序,并运行它安全地根据用户 nobody
(及拦截信号,等等)。此外,它指定存储和时间限制,并采取措施的时间和存储使用。
(如果你是好奇,这是一种"网络官"标记的程序上的试验数据)
目前我已经适应了的 safeexec 模块 mooshak.虽然大多数事情的正常工作,存储器的使用似乎是一个问题。(这是非常不准确)
现在我已经试过的建议 在这里, 和解析,从VM /proc/pid/stat
, 和现在的精确度问题是固定的。然而,对于程序完成的真的很快不仅给回0.
的 safeexec 程序似乎运作这样的:
- 它的
fork()
s - 使用
execv()
在孩子过程的运行所需的程序 - 监视器的程序从父母进程,直到孩子过程终止(使用
wait4
, 发生返回CPU usage-但是没有记忆吗?)
因此,它分析/proc/../stat
孩子的过程(已经取代execv)
所以为什么是虚拟机 /proc/child_pid/stat
有时候,等于0?
这是因为execv()完成的速度太快, /proc/child_pid/stat
只是不是?
如果是这样,是否有某种其他方式获取存储器使用的孩子?
(因为这意味着法官的程序在一个时间限制,我不能买得起的东西与性的惩罚样才)
在此先感谢。
解决方案
你能安排用于儿童的过程中使用自己的版本 malloc()
et al和有记录的高水准标记忆使用(也许用一个登记与处理程序 atexit()
)?也许你会用中的ld_preload载存储管理的图书馆。这不会帮助有巨大的静态阵列的或巨大的自动阵列。
Hmm,听起来很有趣。任何方法来跟踪的静态/自动阵列,但?
静态存储器可以分析与'size'的命令或多或少。
自动阵列是一个问题-我不知道你如何能够处理的那些。你的记忆分配代码,可以看多少叠是在使用时它被称为(看看地址的地方变量)。但是,没有任何保证存储器将分配时最大量的当地列在使用,所以它提供了在最佳的一个原措施。
一个其他的想法:也许你可以使用调试器技术 ptrace()
系统调用到控制的儿童过程中,特别是要保持它长到足以能够收集存使用情况的统计数据 /proc/...
.
其他提示
你可以设置硬资源限制(setrlimit为RLIMIT_AS资源)之前execve().该计划将不能够分配更多的存储量。如果它试图这样做,存分配的呼吁(brk,mmap,mremap)将失败。如果该程序不能处理的内存条件,就会出现段错误,这将反映在出口的状态中返回的wait4.
你可以使用getrusage(2)功能,从sys/资源。h图书馆。
链接: https://linux.die.net/man/2/getrusage
这种功能使用"rusage"的结构,其中包含ru_maxrss的领域,其中存储有关最大的孩子存储器的使用从所有儿童的当前进程。
这一功能还可以执行,从主要进程之后的所有儿童的程序终止。
获取信息的尝试这样的事情:
struct rusage usage;
int a = getrusage(RUSAGE_CHILDREN, &usage);
但是有一个小小的把戏。
如果你想拥有的信息,每个儿童的进程存储器的使用(不仅是最大的一)必须叉()程序的两倍(第一叉可以让你有独立的过程和第一个将这个过程中,你会想到测试。