функция обработчика сигнала продолжает работать - PullRequest
1 голос
/ 10 мая 2011

Моя функция, созданная для обработки сигнала SIGINT, застряла в постоянном цикле.Идея состоит в том, чтобы сделать CTRL-C игнорируемым родительским процессом, но отправить его дочернему процессу (и они обрабатывают его по умолчанию).Что происходит, когда я нажимаю CTRL-C, вызывается функция обработчика сигнала, но она застревает в бесконечном цикле.Предполагается, что вызов kill отправляет SIGTERM всем процессам в группе процессов, кроме процесса отправителя.Любая помощь будет принята.

код функции:

void intHandler(int signum) {
kill(0, SIGTERM);

}

код вызова функции (в основном):

(void) sigset(SIGINT, intHandler);

1 Ответ

3 голосов
/ 10 мая 2011

Со страницы man kill.

Если pid равен 0, sig должен быть отправлен всем процессам (исключая неопределенный набор системных процессов), чей идентификатор группы процессов равен идентификатору группы процессовотправителя, и для которого процесс имеет разрешение на отправку сигнала.

Ничего о том, чтобы не отправлять сигнал отправителю, поэтому вы, скорее всего, захотите что-то вроде:

void intHandler(int signum) {
    sigset(SIGINT, SIG_DFL);
    kill(0, SIGTERM);
}

Это сбросит ваш обработчик сигнала в отправителе на значение по умолчанию перед отправкой SIGTERM всем членам группы процессов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...