2013-10-03 5 views
1

Возникли вопросы относительно прерывания текущего процесса, который прослушивает сигналы. Ниже мой обработчик. SIGHUP используется для перезагрузки моего файла конфигурации, SIGCHLD используется для waitpid с nohang в процессе, который он запускает, а остальные - для завершения процесса.Правильная обработка сигналов и прерывания

void sig_handler(int sig, siginfo_t *siginfo, void *ucontext) 
{ 
    if (sig == SIGHUP) { 
     reload = 1; 
    } else if(sig == SIGCHLD) { 
     // TODO 
    } else if (sig == SIGTERM || sig == SIGKILL || sig == SIGINT) { 
     done = 1; 
    } 
} 

do { 
    if(reload) { 
     // opening files, doing file descriptor stuff 
     ... // processing... 
     **SIHUP OCCURS! WHAT HAPPENS?** <<<<<<<<<<< Line: 505 <<<<<<<<<<<<<<<<<< 
     ... // processing... 
    } 
} while(!done); 

Мое нынешнее понимание сигналов:

  • сигнал происходит
  • полной операции тока на линии 505. т.е.: открытый ("t.txt");
  • выполнения кода обработчика сигнала для завершения
  • возврата к строке 505 и по-прежнему

Что меня беспокоит:

  • сигнала происходит
  • перерыв из текущего кода
  • выполнения код обработчика сигнала до его завершения
  • продолжать с выходить код

Вопросы:

  1. Должен ли я улучшить свой код, чтобы блокировать SIGHUP, SIGTERM, SIGCHLD во время перезагрузки конфигурации, так что у меня нет нестабильный код, если возникнет сигнал? Или это чрезмерный дизайн? (Предполагая, что он не возобновляется после)
  2. Скажите, что я в обработчике сигналов для SIGHUP, но затем появляется сигнал SIGHUP, что происходит? (Я предполагаю, что он ставит их в очередь и запускает обработчик дважды)

Спасибо!

ответ

0

Фактически, если происходит сигнал, ваша текущая операция не обязательно заканчивается до вызова обработчика сигнала. Однако после завершения обработчика сигнала ваш код возобновляется с того места, где он был, когда сигнал прерывался. И так как весь ваш обработчик сигнала задает переменную флага, на код, который в настоящее время находится в середине всего того, что он делает, не влияет.

Ответы:

  1. зачем? Ваш код делает резюме после, и любой правильно спроектированный обработчик сигналов не дестабилизирует код.
  2. Документация, похоже, указывает, что обработка второго сигнала будет отложена до завершения первого обработчика. См. this question.
+0

Очень информативный вопрос, с которым вы связались. Благодарю. – user2843645

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