2011-04-26 115 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之間的任何值。

相關問題