当OOM Killer杀死一个进程时的返回代码

10

我正在使用SUSE SLES 11操作系统在POWER7系统上运行一个基于SPEC CPU2006基准测试的多程序工作负载。

有时,工作负载中的每个应用程序都会消耗大量内存,而总内存占用量超过了系统安装的可用内存(32 GB)。

我禁用了交换空间,否则使用交换空间的进程可能会严重影响测量结果。我知道这样做后,内核可能会通过OOM killer杀死一些进程。这完全没有问题。问题是我希望被内核杀死的线程以错误条件退出(例如,该进程被信号终止)。

我有一个框架启动所有进程,然后等待它们完成使用

waitpid(pid, &status, 0);

即使线程被OOM killer杀死(我知道因为我在屏幕上和/var/log/messages中收到了消息),调用

WIFEXITED(status);

返回1,并调用该函数。

WEXITSTATUS(status);

返回零。因此,我不能区分进程何时正确完成以及何时被OOM killer杀死。

我做错了什么吗?你知道检测进程是否已被OOM killer杀死的任何方法吗?

我在这篇帖子中发现了几乎相同的问题。然而,由于这是旧帖子且答案不令人满意,因此我决定发表一个新问题。


WIFSIGNALLED()是什么情况?是false吗? - Tilman Vogel
1个回答

10

Linux OOM killer使用SIGKILL发送信号。如果您的进程被OOM杀死,那么WIFEXITED返回1是可疑的。

TLPI

为了杀死选定的进程,OOM killer会发送SIGKILL信号。

因此,您可以使用以下命令进行测试:

if (WIFSIGNALED(status)) {
    if (WTERMSIG(status) == SIGKILL)
        printf("Killed by SIGKILL\n");
}

这正是我所期望的,但尝试后它并没有起作用。WIFSIGNALED(状态)对于所有进程(包括被杀死的进程)都返回零。有什么想法吗? - betabandido
@Victor 只是为了测试;尝试使用 kill(..., SIGKILL) 来杀死它们。看看会发生什么。 - cnicutar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接