回答
在Linux中,您可能要使用setrlimit。不過,不要打擾殺害孩子。當他們耗盡記憶時,他們會自己死去。
假設你在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(...);
}
如果您的孩子進程試圖超過此分配更多的內存,它不會自動殺死,但它將無法滿足內存分配請求。如果兒童節目在這種情況下選擇放棄,那麼它會死亡。如果選擇繼續,則不會通知家長這種情況。
你可以使用一個整數作爲'const struct rlimit *'第二個參數? – 2011-04-26 00:17:34
@Mike DeSimone:不,那是一個錯誤,我修正了它。 – 2011-04-26 00:18:08
+1比我的回答更完整(因此更有用)。 – 2011-04-26 00:19:46
閱讀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
之間的任何值。
- 1. 限制.NET進程可以使用的最大內存量?
- 2. 如何限制我的C代碼可訪問的內存量?
- 3. 如何限制IIS Express的內存使用量/強制應用程序池recyle
- 4. 限制內存使用量?
- 5. 如何限制iOS應用程序的內存使用情況
- 6. 如何減少Socket應用程序的C#內存使用量
- 7. 限制可以在twiki中使用的變量的數量
- 8. 我可以通過它佔用的內存量限制HashMap嗎?
- 9. 限制工作量以控制內存使用量
- 10. 如何限制PROMELA使用的內存?
- 11. 如何限制CreateCell c#程序網格生成團結
- 12. 如何限制可擴展存儲引擎(JetBlue)的內存使用量?
- 13. 如何限制使用SQL結果生成的頁面數量
- 14. Leveldb極限測試 - 限制程序使用的內存
- 15. 如何在一個月內限制應用程序的使用
- 16. 設置我的程序可以產生的進程數限制
- 17. 的內存限制應用程序可用
- 18. 人工限制C/C++內存使用
- 19. 限制人們可以在foswiki中使用的變量數量
- 20. 如何保存存儲在內存中的動態生成的程序集?
- 21. C程序可以在與生成相同的生成文件中執行嗎?
- 22. 限制Linux中程序的內存使用情況
- 23. 在C程序中,我們可以使變量的名稱成爲變量嗎?
- 24. 如何在執行期間測量C/C++/Java程序使用的內存?
- 25. 在iOS應用程序中保存用戶生成的內容
- 26. 使用System.Addin與內存中生成的程序集
- 27. 如何在require()時限制內存使用量?
- 28. 我可以限制我的C#應用程序
- 29. 限制JVM可以使用的活動線程/內核的數量
- 30. 如何在Rails應用程序中存儲用戶生成的內容
什麼平臺? C++不能單獨做到這一點;它不知道過程的概念。但你的平臺可能會這樣做。 – 2011-04-26 00:09:41
@Billy考慮到他打算使用execv,我猜測他是在Unix下。但是,好點。 – 2011-04-26 00:15:59
@Etienne:原來的問題沒有那個珍聞。 – 2011-04-26 01:06:07