О SIGINT в дочерних процессах

Пишу оболочку, теперь дело доходит до управления дочерним процессом. Когда я использую signal (SIGTERM, SIG_DFL); в дочернем процессе,

сигнал SIGINT генерируется Ctrl + C, и этот сигнал завершает всю оболочку ОС.

как я могу просто завершить процесс, например, только «кошку», но не всю оболочку ?? Должен ли я использовать что-то вроде:

void sig_handler(int sig) {
if(sig ==SIGINT)
{
kill(pid);
}
}

Действительно спасибо слот.


person C learner    schedule 02.10.2013    source источник
comment
Вы пробовали? Каков был результат?   -  person alk    schedule 02.10.2013
comment
Я предполагаю, что дочерний процесс станет зомби.   -  person C learner    schedule 02.10.2013


Ответы (2)


Ваш вопрос довольно расплывчатый. Можете ли вы более четко определить, чего вы хотите достичь? Я думаю, вы должны использовать сигнал (SIGTERM, sig_handler) вместо SIG_DFL, который является действием по умолчанию. Поскольку у вас есть обработчик сигналов, вы вызываете его вместо предопределенных функций, таких как SIG_INT или SIG_DFL. Код внутри вашей функции выглядит нормально. Пока вы знаете pid, вы можете убить (pid).

person bnsk    schedule 02.10.2013

В дочернем exec'е обработчики SIGINT (и SIGQUIT) будут иметь значение SIG_DFL, если они были установлены на обработчик в родительской оболочке, и это, скорее всего, правильно. (Конечно, вы не можете наследовать обработчик сигнала не по умолчанию через exec, потому что функция обычно даже не существует в exec-процессе.)

Установка обработчика для SIGTERM не повлияет на ответ на SIGINT и наоборот.

Ваша оболочка не должна доставлять сигналы своим дочерним элементам.

person Jonathan Leffler    schedule 02.10.2013