Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2024, 18:02   #1
Салага
Пользователь
 
Регистрация: 03.03.2018
Сообщений: 20
По умолчанию Как остановить потомка, когда умер родитель?

Здравствуйте

Успешно форкаю процесс. Потом родитель ловит sigsegv, но потомок продолжает висеть.
Никак не могу нагуглить способ, чтобы потомок умирал вместе с родителем при такой ситуации.

Разбираюсь в причинах segfault, но пока не починил и хочется, чтобы хотя бы процессы все умирали

Спасибо!
Салага вне форума Ответить с цитированием
Старый 04.07.2024, 18:15   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,772
По умолчанию

Напишите и установите обработчик для сигнала
p51x вне форума Ответить с цитированием
Старый 04.07.2024, 18:36   #3
Салага
Пользователь
 
Регистрация: 03.03.2018
Сообщений: 20
По умолчанию

Спасибо большое. Не додумался сразу

Но если там кроме exit нечего вызывать, то можно как-то обойтись без обработчика? Точнее не без него, а красивее него
Салага вне форума Ответить с цитированием
Старый 05.07.2024, 12:54   #4
DeepFlake
Пользователь
 
Регистрация: 16.05.2024
Сообщений: 92
По умолчанию

Когда родительский процесс завершается, то родителем сироты становится init-подсистема, у которой pid равен 1.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdbool.h>
#include <stdint.h>

int main()
{
    int errorcode ;
    pid_t forkstatus;
    pid_t parentid;
    
    errorcode   = EXIT_SUCCESS ;
    forkstatus  = fork() ;
    if ( forkstatus == 0 )
    {
        // дочерний процесс
        while ( true )
        {
            parentid    = getppid() ;
            printf( "%jd\n", (intmax_t) parentid ) ;
            //fflush( stdout );
            if ( ( (intmax_t) parentid ) == 1L )
            {
                // родительский завершился
                exit( EXIT_FAILURE ) ;
            }
            sleep( 1 ) ;
        }
    }
    else if ( forkstatus > 0 )
    {
        // родительский процесс
        sleep( 5 );
    }
    else if ( forkstatus == -1 )
    {
        perror( "fork" );
        errorcode   = EXIT_FAILURE;
    }
    else
    {
        fprintf( stderr, "some error that never can be\n" );
        errorcode   = EXIT_FAILURE;
    }
    
    return errorcode;
}
Здесь родительский процесс работает 5 секунд и завершается. Дочерний проверяет в цикле идентификатор родителя.
Вывод программы:
Код:
1530
1530
1530
1530
1530
1

Последний раз редактировалось DeepFlake; 05.07.2024 в 13:05.
DeepFlake вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работает когда в UserForm1.Image7 есть картинка. Когда нет - выдаёт ошибку. Вадим12091965 Microsoft Office Excel 2 27.05.2020 15:57
Почему когда я вешаю запрос на форму, то в ответ приходит error, а когда на див, то success? Sentim JavaScript, Ajax 2 13.05.2017 09:03
Родитель-потомок Владимир Чернов Общие вопросы Delphi 0 07.12.2010 12:48
Родитель-потомок Владимир Чернов Помощь студентам 0 01.12.2010 15:53
динамический родитель динамического объекта russianstrike Компоненты Delphi 6 03.10.2008 22:07