2016-03-30 2 views
3

Я запрограммировал демона, который обычно приостанавливается и делает что-то после получения сигнала (я использую 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(); 
     } 
    } 
} 

Это похоже на работу, как я хотел. кто-нибудь думает, что есть какие-то проблемы с этим кодом?

+1

Почему бы не переместить раздел A в обработчик сигнала? – user3528438

+0

Я попытался переместить секцию A в обработчик сигнала. но если новый сигнал SIGHUP встречается в середине выполнения обработчика, он снова выполняет обработчик сигналов после завершения функции обработчика для предыдущего сигнала. я хочу, чтобы следующий сигнал не просыпался пауза(). –

+1

http://stackoverflow.com/questions/5285414/signal-queuing-in-c – user3528438

ответ

1

pthread_sigmask() может использоваться для маскировки сигнала в потоке. sigprocmask() может использоваться для маскировки сигнала в приложении с одной нитью.

+0

спасибо, что ответили на мой вопрос, гж. я попытался использовать sigprocmask() сразу после паузы() и в конце раздела A. Но после завершения раздела A раздел A снова выполняется сигналом, произошедшим в середине выполнения предыдущего сигнала. Итак, я хочу, чтобы следующий сигнал не просыпался pause(). –

+0

@ SB.Son, вы должны пересмотреть свой поток обработки, а не только о том, как блокировать сигналы. пожалуйста, обратитесь к ответу, предоставленному pilcrow. – gzh

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