Linux OOM killer终止进程时返回代码

Linux OOM killer终止进程时返回代码,linux,out-of-memory,waitpid,return-code,Linux,Out Of Memory,Waitpid,Return Code,我正在使用SUSE SLES 11在POWER7系统上运行一个多道程序工作负载(基于SPEC CPU2006基准测试) 有时,工作负载中的每个应用程序都会消耗大量内存,并且总内存占用超过系统中安装的可用内存(32 GB) 我禁用了交换,因为否则,对于使用交换的进程,测量可能会受到严重影响。我知道,通过OOM killer,内核可能会杀死一些进程。那太好了。问题是,我希望被内核杀死的线程带着错误条件退出(例如,进程被信号终止) 我有一个框架,可以启动所有流程,然后使用 waitpid(pid, &

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

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

我禁用了交换,因为否则,对于使用交换的进程,测量可能会受到严重影响。我知道,通过OOM killer,内核可能会杀死一些进程。那太好了。问题是,我希望被内核杀死的线程带着错误条件退出(例如,进程被信号终止)

我有一个框架,可以启动所有流程,然后使用

waitpid(pid, &status, 0);
即使一个线程被OOM杀手杀死(我知道,因为我在屏幕和/var/log/messages中收到一条消息),调用

WIFEXITED(status);
返回一个,然后调用

WEXITSTATUS(status);
返回零。因此,我无法区分进程何时正确完成以及何时被OOM杀手杀死

我做错什么了吗?你知道什么时候进程被OOM杀手杀死的方法吗


我发现问的问题几乎是一样的。然而,由于这是一篇旧帖子,答案并不令人满意,我决定发布一个新问题。

Linux OOM killer通过发送
SIGKILL
来工作。如果您的进程被OOM终止,
WIFEXITED
返回1是可疑的

TLPI

要终止所选进程,OOM killer将传递一个SIGKILL 信号

因此,您应该能够使用以下方法对此进行测试:

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

这是我所期望的,但在尝试之后,它没有起作用。WIFSIGNALED(status)为所有进程(包括已终止的进程)返回零。有什么想法吗?@Victor只是为了测试;试着用
kill(…,SIGKILL)
杀死它们。看看会发生什么。WIFSIGNALLED()呢?这是假的吗?