У меня есть основной процесс, и из него возникает некий дочерний процесс. В какой-то момент я должен передать сигнал 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);
Я не получаю никаких ошибок. Но родителя убивают. Я делаю что-то неправильно здесь?
nPgid = getpgid(parentPID);
Что такое parentPID
? Получить группу вызывающего процесса либо передать 0
либо результат getpid()
.
От man getpgid()
:
getpgid() возвращает PGID процесса, указанного pid. Если pid равно нулю, используется идентификатор процесса вызывающего процесса. (Извлечение PGID процесса, отличного от вызывающего, редко необходимо, и POSIX.1 getpgrp() является предпочтительным для этой задачи.)
Из этого выше текста я сделаю вывод, чтобы сделать
nPgid = getpgid(o);
SIG_IGN
в вашем коде. Покажите тестовый пример .