Я запрограммировал демона, который обычно приостанавливается и делает что-то после получения сигнала (я использую SIGHUP для пробуждения его к другому процессу).Как заблокировать один и тот же сигнал при обработке сигнала?
Вот мой код.
...
static volatile sig_atomic_t saw_hup = 0;
static void sighup_handler(int s)
{
saw_hup = 1;
}
int main(void)
{
struct sigaction act_new;
...
sigemptyset(&act_new.sa_mask);
act_new.sa_handler = sighup_handler;
sigaction(SIGHUP, &act_new, NULL);
while(1) {
saw_hup = 0;
pause();
if(saw_hup) {
do_section_A();
}
}
}
Насколько я проверил это, кажется, что есть какой-то стек для сигнала, поэтому сигнал, который происходит при выполнении раздела A, делает демон пробудить вверх от паузы() выполнить раздел А снова сразу после окончания раздела A предыдущим.
Но, я хочу, чтобы следующий сигнал SIGHUP был заблокирован, а не выполнял раздел A еще раз. Я хочу выполнить раздел A всякий раз, когда выполняется SIGHUP, за исключением того, что в середине раздела A выполняется предыдущий сигнал SIGHUP. Как мне это сделать?
Я думаю, что я проблема, раздел А выполняется снова сразу после того, как раздел А исполнение по SIGHUP произошло в середине секции выполнения.
Вот мой модифицированный код
...
static volatile sig_atomic_t saw_hup = 0;
static void sighup_handler(int s)
{
saw_hup = 1;
}
int main(void)
{
struct sigaction act_new;
...
sigemptyset(&act_new.sa_mask);
act_new.sa_handler = sighup_handler;
sigaction(SIGHUP, &act_new, NULL);
while(1) {
saw_hup = 0;
pause();
if(saw_hup) {
do_section_A();
}
}
}
Это похоже на работу, как я хотел. кто-нибудь думает, что есть какие-то проблемы с этим кодом?
Почему бы не переместить раздел A в обработчик сигнала? – user3528438
Я попытался переместить секцию A в обработчик сигнала. но если новый сигнал SIGHUP встречается в середине выполнения обработчика, он снова выполняет обработчик сигналов после завершения функции обработчика для предыдущего сигнала. я хочу, чтобы следующий сигнал не просыпался пауза(). –
http://stackoverflow.com/questions/5285414/signal-queuing-in-c – user3528438