Будет ли дочерний процесс отправлять SIGCHLD в abort()?
Если приложение делает fork()
и ребенок умирает с abort()
(из-за сбоя assert()
), родительский процесс получит SIGCHLD
?
Если это уместно, это на Debian 4 (gcc версии 4.1.2).
2 ответа
Если вы хотите проверить то же самое, напишите пример кода, который разветвляет дочерний элемент, и дочерний элемент вызывает abort() (чтобы подать сигнал sigabrt). Проверьте его вывод на strace.(Исполняемый файл strace)
Для следующего кода:
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t pid;
if(pid=fork()<0)
{
fprintf(stderr,"Error in forking");
}
else if(pid==0)
{
/*The child*/
abort();
}
else {
waitpid(pid,(int *)0,0);
}
return 0;
}
Я получаю этот вывод:
--- SIGCHLD (Child exited) @ 0 (0) ---
gettid() = 4226
tgkill(4226, 4226, SIGABRT) = 0
--- SIGABRT (Aborted) @ 0 (0) ---
+++ killed by SIGABRT +++
Так что ответ - да, по крайней мере в дистрибутиве Ubuntu.
Вы можете ожидать, что родитель получит SIGCHLD в любое время, когда ребенок завершит свое обучение, если только ребенок не отделился от родителя (IIRC, используя setsid() или setpgrp()). Основная причина, по которой ребенок делает это, заключается в том, что ребенок запускает процесс демона. Смотрите здесь или здесь для более глубокого рассмотрения процессов демона.