当父进程不是 root 时,有什么办法可以确定子进程是被内核用 SIGKILL 杀死的吗?

Ros*_*ost 3 c unix kernel signals kill-process

我遇到的情况是,有一个非根(所以我无法读取内核日志)父进程及其子进程,子进程可能已被内核用 SIGKILL 杀死,因为它消耗了大量内存。当发生这种情况时,父进程应该知道子进程是因为超出内存限制(理想情况下)而被杀死的,但我什至不知道是否可以弄清楚它是被 SIGKILL 杀死的,更不用说原因了。所以我需要从父进程的角度了解孩子是否被 SIGKILL 杀死,以及这是否是发生的原因(但这是第二个问题)。

有人可以给我建议吗?谢谢。

P.P*_*.P. 6

您需要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.