Вам нужно wait(2)
на дочернем объекте и использовать макрос WIFSIGNALED
, чтобы проверить, был ли он завершен сигналом.
int status = 0;
// wait for child to exit
pid_t child_pid = wait(&status);
if (WIFEXITED(status))
{
fprintf("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) {
...
}
Невозможно точно определить, кто послал убийство (будь то убийцей OOM или чем-то еще, например, можно сделать kill -9 PID
из оболочки). Разумно предположить, что сигналы не отправляются без разбора в системе, и что обычно само ядро (OOM killer) посылает SIGKILL.