Ros*_*ost 3 c unix kernel signals kill-process
我遇到的情况是,有一个非根(所以我无法读取内核日志)父进程及其子进程,子进程可能已被内核用 SIGKILL 杀死,因为它消耗了大量内存。当发生这种情况时,父进程应该知道子进程是因为超出内存限制(理想情况下)而被杀死的,但我什至不知道是否可以弄清楚它是被 SIGKILL 杀死的,更不用说原因了。所以我需要从父进程的角度了解孩子是否被 SIGKILL 杀死,以及这是否是发生的原因(但这是第二个问题)。
有人可以给我建议吗?谢谢。
您需要wait(2)在子进程上使用宏WIFSIGNALED来检查它是否被信号终止。
int status = 0;
// wait for child to exit
pid_t child_pid = wait(&status);
if (WIFEXITED(status))
{
printf("exited with %d\n", WEXITSTATUS(status));
}
else if (WIFSIGNALED(status))
{
printf("Signaled with %d\n", WTERMSIG(status));
}
Run Code Online (Sandbox Code Playgroud)
如果您有多个子进程,则可以使用循环来等待所有子进程。
WTERMSIG(status)将返回信号编号。要找出信号,您可以检查:
if (WTERMSIG(status) == SIGKILL) {
...
} else if (WTERMSIG(status) == SIGTERM) {
...
}
Run Code Online (Sandbox Code Playgroud)
没有办法准确地找出是谁发出了杀戮(无论是 OOM 杀手还是其他东西,例如,可以kill -9 PID从 shell 中执行)。可以合理地假设信号不会在系统上不加区别地发送,并且通常是内核本身(OOM 杀手)发送SIGKILL.