#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 и завершает работу. я не хочу, чтобы родительский процесс завершался.