如何限制子进程中的内存使用,并在Linux上出现内存不足时进行检查

时间:2018-08-23 08:04:14

标签: c linux linux-kernel

我使用setrlimit API来限制子流程资源并在父流程中进行检查。

当子进程超出内存限制时,它将由SIGSEV信号终止,但是我还有其他原因也会导致SIGSEV信号,因此我无法判断是否子进程超出了内存限制。

有没有办法知道子进程是否超出了内存限制?

1 个答案:

答案 0 :(得分:0)

这取决于达到哪个限制。

如果达到您的内存限制(-d-v),则malloc(将作为基础的brk()/sbrk()调用)将失败,并以NULL作为返回值。如果未选中此错误条件,则您的程序现在只会进行segfault。您可以检查访问 near 地址0(结构成员访问),然后尝试猜测是否为未经检查的malloc访问。如果您知道自己不在任何地方进行malloc检查,则还可以编写一个带有assert(ret != NULL);或类似名称的包装器。

如果达到堆栈限制(-s),则情况有所不同;一个进程只需要访问堆栈中的内存即可,操作系统会自动扩大堆栈。如果没有达到限制,则不会。您可以通过查看引起错误的地址(在处理程序的siginfo_t结构中)并检查是否在堆栈附近来识别此错误。

所有其他ulimit均不应生成段错误。