![](/img/trans.png)
[英]How to limit program runtime, memory usage and as a specific user programmatically in Linux
[英]How to limit the memory usage in subprocess and check it when out of memory on Linux
我使用setrlimit
API限制子流程資源,並在父流程中進行檢查。
當子進程超出內存限制時,它將被SIGSEV
信號終止,但是我還有其他原因也會導致SIGSEV
信號,因此我無法判斷子進程是否超出了內存限制。
有沒有辦法知道子進程是否超出了內存限制?
這取決於達到哪個限制。
如果達到您的內存限制( -d
, -v
),則malloc(分別是底層的brk()/sbrk()
call)將失敗,返回值為NULL
。 如果未選中此錯誤條件,則您的程序現在只會進行segfault。 您可以檢查地址0 附近的訪問(結構成員訪問),然后嘗試猜測是否是未經檢查的malloc訪問。 如果您知道自己不在任何地方進行malloc檢查,則還可以編寫一個帶有assert(ret != NULL);
的包裝器assert(ret != NULL);
或類似。
如果達到了堆棧限制( -s
),則情況有所不同; 一個進程只需要訪問堆棧中的內存即可,操作系統會自動擴大堆棧。 如果沒有達到限制,則不會。 您可以通過查看引起故障的地址(在處理程序的siginfo_t
結構中)並檢查其是否在堆棧附近來識別此錯誤。
所有其他ulimit均不應生成段錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.