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?
warum nicht Abschnitt A zum Signalhandler verschieben? – user3528438
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(). –
http://stackoverflow.com/questions/5285414/signal-queuing-in-c – user3528438