2011-04-26 42 views
3

在我的C++程序中,我将启动其他程序。如果这些程序使用超过一定的内存,我希望我的程序杀死他们的进程。如何做到这一点?如何限制生成的程序可以在C++中使用的内存量

我可能会用execv来启动程序。

+1

什么平台? C++不能单独做到这一点;它不知道过程的概念。但你的平台可能会这样做。 – 2011-04-26 00:09:41

+0

@Billy考虑到他打算使用execv,我猜测他是在Unix下。但是,好点。 – 2011-04-26 00:15:59

+0

@Etienne:原来的问题没有那个珍闻。 – 2011-04-26 01:06:07

回答

4

在Linux中,您可能要使用setrlimit。不过,不要打扰杀害孩子。当他们耗尽记忆时,他们会自己死去。

7

假设你在POSIX系统上,你可以在fork()之后调用setrlimit(2)来限制它。例如:

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(...); 
} 

如果您的孩子进程试图超过此分配更多的内存,它不会自动杀死,但它将无法满足内存分配请求。如果儿童节目在这种情况下选择放弃,那么它会死亡。如果选择继续,则不会通知家长这种情况。

+0

你可以使用一个整数作为'const struct rlimit *'第二个参数? – 2011-04-26 00:17:34

+0

@Mike DeSimone:不,那是一个错误,我修正了它。 – 2011-04-26 00:18:08

+0

+1比我的回答更完整(因此更有用)。 – 2011-04-26 00:19:46

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) ... 

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

一些注意事项:软限制(rlim_cur)可能会通知进程超出了限制。超过硬限制(rlim_max)会使malloc()失败,将errno设置为ENOMEM,这通常会导致进程死亡。阅读手册页或尝试一下,看看它如何在你的系统上运行。如果堆栈超过rlim_max,则可能会收到SIGSEGV信号。

通常,只有根进程可以引发rlim_max。常规过程可以降低rlim_max或将rlim_cur设置为0到rlim_max之间的任何值。

相关问题