SIG_IGN не удается игнорировать сигнал SIGINT

#c #c #linux #signals

#c #c #linux #сигналы

Вопрос:

У меня есть основной процесс, и из него возникает какой-то дочерний процесс. В определенный момент времени я должен передать сигнал SIGINT всему дочернему процессу, но не основному процессу. Я не могу сохранить идентификаторы pid для всех дочерних процессов. Поэтому я использовал SIG_IGN для игнорирования SIGINT в основном процессе и установил значение по умолчанию после моего действия. Но это не работает.

Пожалуйста, найдите мой фрагмент кода ниже:

     /* Find group id for process */
    nPgid = getpgid(parentPID);

    /* Ignore SIGINT signal in parent process */
    if (signal(SIGINT, SIG_IGN) == SIG_ERR)
    {
        cout << "Error in ignoring signal n");
    }

    /* Send SIGINT signal to all process in the group */
    nReturnValue = kill ( (-1 * nPgid), SIGINT);
    if (nReturnValue == RETURN_SUCCESS)
    {
        cout << "Sent SIGINT signal to all process in group successfully n";
    }
    else
    {
        cout << "Alert!!! Unable to send SIGINT signal to all process in the group n";
    }

    /* Set SIGINT signal status to default */
    signal (SIGINT, SIG_DFL);
    sleep(2);
  

Я не получаю никакой ошибки. Но родительский элемент убивается. Я делаю здесь что-то не так?

Комментарии:

1. Я нигде не вижу SIG_IGN в вашем коде. Показать тестовый пример.

2. Ваш код содержит синтаксическую ошибку и не компилируется. После исправления этого я не могу воспроизвести поведение, которое вы описываете.

Ответ №1:

 nPgid = getpgid(parentPID);
  

Что такое parentPID ? Получить группу вызывающего процесса либо передать 0 , либо результат getpid() .

От man getpgid() :

getpgid() возвращает PGID процесса, указанного pid. Если pid равен нулю, используется идентификатор процесса вызывающего процесса. (Получение PGID процесса, отличного от вызывающего, редко требуется, и для этой задачи предпочтительнее использовать POSIX.1 getpgrp() .)

Из этого текста выше я бы сделал вывод, чтобы сделать

 nPgid = getpgid(o);
  

Комментарии:

1. В любом случае я смог получить идентификатор группы для этого процесса. происходит передача сигнала sigint всей группе. но, несмотря на то, что я передаю SIG_IGN в родительский процесс, он также получает сигнал sigint и завершает работу. я не хочу, чтобы родительский процесс завершался.