当OOM杀手杀死进程时返回代码

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

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

我禁用了交换,否则测量可能会严重影响使用交换的过程。 我知道通过这样做,内核通过OOM杀手可能会杀死一些进程。 那完全没问题。 问题是,我期望内核被杀死的线程退出并出现错误情况(例如,进程被一个信号终止)。

我有一个框架,启动所有的进程,然后等待他们使用

waitpid(pid, &status, 0); 

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

 WIFEXITED(status); 

返回一个,然后调用

 WEXITSTATUS(status); 

返回零。 因此,我无法区分一个进程何时完成,何时被OOM杀手杀死。

我做错了什么? 你知道有什么方法可以检测到一个进程已经被OOM杀手杀死了吗?

非常感谢你,

胜利者

PS:我发现这个post提出了几乎相同的问题。 然而,由于这是一个旧的post,答案并不令人满意,所以我决定发表一个新的问题。

Solutions Collecting From Web of "当OOM杀手杀死进程时返回代码"

Linux OOM杀手通过发送SIGKILL 。 如果你的进程被OOM杀死,那么WIFEXITED返回1。

TLPI

杀死选定的进程,OOM杀手提供一个SIGKILL信号。

所以你应该可以使用下面的方法来测试它:

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