Возникли вопросы относительно прерывания текущего процесса, который прослушивает сигналы. Ниже мой обработчик. 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 и по-прежнему
Что меня беспокоит:
- сигнала происходит
- перерыв из текущего кода
- выполнения код обработчика сигнала до его завершения
- продолжать с выходить код
Вопросы:
- Должен ли я улучшить свой код, чтобы блокировать SIGHUP, SIGTERM, SIGCHLD во время перезагрузки конфигурации, так что у меня нет нестабильный код, если возникнет сигнал? Или это чрезмерный дизайн? (Предполагая, что он не возобновляется после)
- Скажите, что я в обработчике сигналов для SIGHUP, но затем появляется сигнал SIGHUP, что происходит? (Я предполагаю, что он ставит их в очередь и запускает обработчик дважды)
Спасибо!
Очень информативный вопрос, с которым вы связались. Благодарю. – user2843645