我使用setrlimit
API 来限制子进程资源并在父进程上检查它。
当子进程超过内存限制时,会被SIGSEV
信号终止,但我有一些其他原因也导致了SIGSEV
信号,所以我无法判断子进程是否超过了内存限制。
有没有办法知道子进程是否超过内存限制?
这取决于达到的限制。
如果达到内存限制(-d
、-v
(,malloc(或底层brk()/sbrk()
-call(将失败,返回值为NULL
。如果未检查此错误条件,则程序现在只会出现段错误。您可以检查地址 0附近的访问(结构成员访问(,然后尝试猜测它是否是未经检查的 malloc 访问。如果您知道,您不会在任何地方进行 malloc 检查,您还可以编写带有assert(ret != NULL);
或类似内容的包装器。
如果达到堆栈限制(-s
(,则情况有所不同;进程只需访问堆栈中的内存,操作系统就会自动放大堆栈;或者没有,如果达到限制。您可以通过查看导致故障的地址(在处理程序的siginfo_t
结构中(并检查它是否靠近堆栈来识别这一点。
所有其他 ulimit 不应生成段错误。