6

我想运行一个设置了内存限制的进程(理想情况下也是数据段、堆栈和堆)我的代码看起来像

child = fork();
if ( child == 0 ) 
{
    ...
    execv( program, args );
}
wait( &status );

并且这个结构应该是保存器,我用它做了一些事情(重定向标准输入/输出,测量执行时间等)

我的问题:如何为程序进程设置内存限制并让父母知道,如果超过了?进程不应该被sigsegv杀死,我想知道,进程被杀死只是因为这个内存限制。或者更好的是,有没有办法在这个过程完成时获得内存使用情况?该过程完成后,我可以比较最大使用内存。

我不能使用 valgrind(或类似的东西),因为我不能减慢执行时间。

4

3 回答 3

2

您可以setrlimit()在检查子进程之后和调用之前execv()调用。我不知道如何通知家长,但也许这会为您指明正确的方向。

于 2013-06-02T21:30:01.700 回答
1

编写自己的内存管理器可以解决这个问题。

对于现代操作系统编写的许多应用程序,libc 的 malloc/free 是可以的,但需要大内存的应用程序不是,它无法告诉我们的程序使用了多少内存。我们可以编写一个树结构的内存上下文类,它是 glibc 的 malloc/free 的包装器,当我们分配一些内存时,预订在这个内存上下文上使用的内存,当我们释放一些内存时,从预订的值中减去值。所以我们可以知道我们实际使用的内存大小。

于 2013-12-16T15:05:38.620 回答
1

您可以ulimit在 a 内调用system(或setrlimit,如 Mike 所写)。当您的程序达到该限制时,malloc 将失败(即返回 NULL),您将需要处理这种情况(它们要么因错误而退出,要么在尝试访问空指针时因 SIGSEGV 而死)。

关于给父母发信号……你能改变孩子的程序吗?您可以返回特定的退出代码。

于 2013-06-02T21:34:20.917 回答