Будет ли дочерний процесс отправлять 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()). Основная причина, по которой ребенок делает это, заключается в том, что ребенок запускает процесс демона. Смотрите здесь или здесь для более глубокого рассмотрения процессов демона.

Другие вопросы по тегам