2016-03-30 5 views
3

Ich programmierte einen Daemon, der normalerweise pausiert und etwas macht, nachdem er ein Signal bekommen hat (ich benutze SIGHUP, um es zu einem anderen Prozess aufzuwecken).Wie man das gleiche Signal während der Verarbeitung eines Signals blockiert?

Hier ist mein Code.

... 
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(); 
     } 
    } 
} 

Soweit ich es getestet haben, so scheint es, dass es einige Stapel für das Signal ist, so dass das Signal, der Abschnitt A in der Ausführung auftritt, macht den Dämon aus Pause aufwecken() erneut Abschnitt A ausführen direkt nach dem Beenden von Abschnitt A nach dem vorherigen.

Aber ich möchte das nächste SIGHUP-Signal blockiert werden und Abschnitt A nicht erneut damit ausführen. Was ich will, ist, Sektion A immer dann auszuführen, wenn SIGHUP auftritt, außer in der Mitte von Sektion A, die von vorherigem SIGHUP-Signal ausgeführt wurde. Wie mache ich das?


Ich glaube, ich das Problem, dass Abschnitt A wieder rechts nach Abschnitt ausgeführt wird, eine Ausführung von SIGHUP in der Mitte eine Ausführung des Abschnitts aufgetreten.

Hier ist meine modifizierte Code

... 
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(); 
     } 
    } 
} 

Es scheint zu arbeiten, wie ich wollte. denkt irgendjemand, dass es ein Problem mit diesem Code gibt?

+1

warum nicht Abschnitt A zum Signalhandler verschieben? – user3528438

+0

Ich habe versucht, Abschnitt A zum Signalhandler zu bewegen. wenn jedoch ein neues SIGHUP-Signal in der Mitte der Handler-Ausführung auftritt, führt es den Signal-Handler nach Beendigung der Handler-Funktion für das vorherige Signal erneut aus. Was ich will, ist für das nächste Signal nicht aufzuwachen Pause(). –

+1

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

Antwort

1

pthread_sigmask() kann verwendet werden, um das Signal im Thread zu maskieren. sigprocmask() kann verwendet werden, um Signale in Single-Thread-Anwendungen zu maskieren.

+0

danke für die Beantwortung meiner Frage, gzh. Ich habe versucht, sigprocmask() direkt nach Pause() und am Ende von Abschnitt A zu verwenden. Aber nach dem Beenden von Abschnitt A wird Abschnitt A erneut durch das Signal ausgeführt, das mitten in der Ausführung des vorherigen Signals aufgetreten ist. Also, was ich will, ist für das nächste Signal nicht aufzuwachen Pause(). –

+0

@ SB.Son, sollten Sie Ihren Verarbeitungsfluss, nicht nur auf, wie Signale zu blockieren. Bitte beachten Sie die Antwort von pilcrow. – gzh

Verwandte Themen