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



我使用setrlimitAPI 来限制子进程资源并在父进程上检查它。

当子进程超过内存限制时,会被SIGSEV信号终止,但我有一些其他原因也导致了SIGSEV信号,所以我无法判断子进程是否超过了内存限制。

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

这取决于达到的限制。

如果达到内存限制(-d-v(,malloc(或底层brk()/sbrk()-call(将失败,返回值为NULL。如果未检查此错误条件,则程序现在只会出现段错误。您可以检查地址 0附近的访问(结构成员访问(,然后尝试猜测它是否是未经检查的 malloc 访问。如果您知道,您不会在任何地方进行 malloc 检查,您还可以编写带有assert(ret != NULL);或类似内容的包装器。

如果达到堆栈限制(-s(,则情况有所不同;进程只需访问堆栈中的内存,操作系统就会自动放大堆栈;或者没有,如果达到限制。您可以通过查看导致故障的地址(在处理程序的siginfo_t结构中(并检查它是否靠近堆栈来识别这一点。

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

相关内容

最新更新