Будет ли дочерний процесс отправлять SIGCHLD на abort ()? - PullRequest
2 голосов
/ 01 октября 2010

Если приложение выполняет fork() и ребенок умирает с abort() (из-за сбоя assert()), родительский процесс получит SIGCHLD?

Если это актуальнонаходится на Debian 4 (gcc версии 4.1.2).

Ответы [ 2 ]

4 голосов
/ 22 ноября 2011

Если вы хотите проверить то же самое, напишите пример кода, который разветвляет дочерний элемент, и дочерний элемент вызывает 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.

1 голос
/ 01 октября 2010

Можно ожидать, что родитель получит SIGCHLD в любое время, когда ребенок завершает свое существование, если только ребенок не отделился от родителя (IIRC с помощью setsid () или setpgrp ()). Основная причина, по которой ребенок делает это, заключается в том, что ребенок запускает процесс демона. См. Здесь или Здесь для более глубокой обработки процессов демона.

...