Правильный способ использования обработчиков сигналов - PullRequest
3 голосов
/ 24 января 2012

Как правильно использовать обработчики сигналов?

Я видел приведенные ниже коды из этого вопроса , и мне было интересно, почему вам все еще нужно поместить signal(SIGSEGV,sig_func); внутри sig_func? Не создаст ли это бесконечный цикл, когда процесс получит сигнал SIGSEGV?

void sig_func(int sig)
{
  write(1, "Caught signal 11\n", 17);
  signal(SIGSEGV,sig_func);
}

int main()
{


 signal(SIGSEGV,sig_func); //Install the signal handler

 //Do work here
}

Ответы [ 2 ]

3 голосов
/ 24 января 2012

В справочнике написано:

Наконец, если обработчик установлен на функцию sighandler, то сначала либо обработчик сбрасывается на SIG_DFL, либо выполняется зависящая от реализации блокировка сигнала, и следующий sighandler вызывается с аргументом signum.

Повторный вызов signal используется для переустановки пользовательского обработчика после того, как он (возможно) был сброшен до SIG_DFL.

1 голос
/ 24 января 2012

в приведенном вами примере вызов сигнала в sig_funct бесполезен, поскольку вы уже установили обработчик сигнала в main и не изменили его в своем обработчике.

учитывая ваш второй вопрос, нет, он не будетсоздайте бесконечный цикл, потому что signal () устанавливает расположение сигнала SIGSEGV для обработчика, но не выполняет его.

...