![](/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.