如何限制生成的程序可以在C++中使用的内存量

nod*_*nja 4 c++ process

在我的c ++程序中,我将启动其他程序.如果这些程序使用超过一定数量的内存,我希望我的程序杀死他们的进程.怎么办?

我可能会使用execv来启动程序.

Gre*_*ill 8

假设,你是一个POSIX系统上,你可以通过调用这个限制setrlimit(2)之后fork().例如:

if (fork() == 0) {
    struct rlimit limits;
    limits.rlim_cur = 10000000; // set data segment limit to 10MB
    limits.rlim_max = 10000000; // make sure the child can't increase it again
    setrlimit(RLIMIT_DATA, &limits);
    execv(...);
}
Run Code Online (Sandbox Code Playgroud)

如果您的子进程尝试分配比此更多的内存,它将不会自动终止,但它将无法满足内存分配请求.如果儿童计划选择在这种情况下中止,那么它将会死亡.如果选择继续,则不会通知父母这种情况.


Mik*_*one 5

阅读这个setrlimit功能.你可能想要这样的东西:

#include <sys/resource.h>

struct rlimit limits;
limits.rlim_cur = // soft limit
limits.rlim_max = // hard limit
int err = setrlimit(RLIMIT_DATA, &limits);
if(err) ...
Run Code Online (Sandbox Code Playgroud)

这假设您正在为Unix/Linux/BSD/Mac /等编写,而不是Windows ...这似乎是一个很好的猜测,因为你正在使用execv.

一些注意事项:软限制(rlim_cur)可能会通知进程超出限制.超过硬限制(rlim_max)会malloc()导致失败,设置errnoENOMEM,这通常会导致进程死亡.阅读手册页或尝试一下,看看它在您的系统上是如何工作的.如果堆栈增长rlim_max,您可能会收到SIGSEGV信号.

通常,只有根进程才能引发rlim_max.常规过程可以降低rlim_max或设置rlim_cur为0到0之间的任何范围rlim_max.