c - 当父进程不是 root 时,有什么方法可以确定子进程被内核用 SIGKILL 杀死

标签 c unix kernel signals kill-process

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

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

最佳答案

您需要wait(2)在 child 上并使用宏 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));
}

如果你有多个子进程,你可以使用一个循环来等待它们。

WTERMSIG(status) 将返回信号编号。要找出信号,您可以检查:

if (WTERMSIG(status) == SIGKILL) {
    ...
} else if (WTERMSIG(status) == SIGTERM) {
    ...
}

没有办法确定到底是谁发送了 kill(无论是 OOM killer 还是其他东西,例如,可以从 shell 中执行 kill -9 PID)。 可以合理地假设信号不会在系统上不分青红皂白地发送,并且通常是内核本身(OOM killer )发送 SIGKILL

关于c - 当父进程不是 root 时,有什么方法可以确定子进程被内核用 SIGKILL 杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58745646/

相关文章:

Linux 内核头文件组织

c - 请解释这个简单的 C 程序的输出

sql - 从非常旧的 unix 机器中提取数据

bash - Unix:根据匹配的字符串将文件分成两个

c - 了解结构及其项目的声明位置

kernel - 如何在 AIX/powerpc 上实现原子分配?

Linux - 识别在物理内存中拥有特定地址的进程

c - C 编程语言中 1 到 100 之间的质数

c++ - cmake 和 2 个库

C 数组大小限制