簡體   English   中英

如何限制子進程中的內存使用,並在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM