2011-05-10 2 views
1

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

функция код:

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

}

код вызова функции (в основной) является:

(void) sigset(SIGINT, intHandler); 
+0

«за исключением процесса отправителя» - спецификация не говорит об этом. Вам нужно заблокировать SIGTERM или удалить процесс из группы процессов. –

+0

или отслеживать его в глобальном режиме и явно «убивать» ребенка вместо всех процессов. IIRC, вы также можете использовать 'sigaction', чтобы гарантировать, что' SIGTERM' игнорируется родителем и разблокируется в дочернем элементе. –

+0

Я закончил делать то, что вы сказали, и он работает точно так, как мне нужно. Спасибо – zetatr

ответ

2

На странице убить человека.

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

Ничто не посылает сигнал к отправителю, так что вы, скорее всего, хотят что-то вроде:

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

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

+0

А я вижу. Разве этот код еще не завершит родительский процесс? Мне нужен родительский процесс для продолжения и уничтожения дочерних процессов. – zetatr

+0

Решено использовать глобальную переменную для отслеживания дочернего процесса pid. – zetatr

+0

Ум, сброс обработчика сигнала SIGINT не заставит SIGTERM убить процесс. –

Смежные вопросы