2016-03-28 11 views
1

wenn je benutzer drücken sie ctrl c, nach meiner anforderung sollte ich es nur nach 10 sek.wie immer ctrl c-signal nach 10 sekunden

Dazu habe ich Schlaf (10) innerhalb Signalhandler-Funktion hinzugefügt, die tatsächlich funktioniert. Ich bin mir nicht sicher, wie es funktioniert. Ist es der richtige Weg, um es zu implementieren? Wird Schlaf brechen etwas, wenn es in einem Signal-Handler aufgerufen wird. Ich bin wirklich fragen, wie es funktioniert .Was der richtige Weg ist, diese

signal_hanlder(int sig num) 
{ 
    sleep(10); 
    my_handler(); 
} 
+0

Was genau sind Ihre Zweifel? Laut dem [signal manual] (http://man7.org/linux/man-pages/man7/signal.7.html) ist 'sleep' async-sicher, also ist es in Ordnung, einen Signal-Handler aufzurufen. Aber ob das der beste/richtige Weg ist, hängt von Ihren genauen Anforderungen ab. Zum Beispiel, wenn die Anforderung ist, dass das Programm normal für weitere 10 Sekunden läuft, bevor das Signal behandelt wird, würde offensichtlich der obige Code diese Anforderung nicht erfüllen, da "Schlaf" die Ausführung unterbricht. – kaylum

+0

@ kaylum .: Ich bin nur besorgt, ob es richtig oder falsch ist. Ich bin mir nicht sicher, wie ein Signalhandler schlafen könnte. Was meinst du mit "Programm läuft normalerweise für weitere 10 Sekunden, bevor das Signal behandelt wird, dann würde offensichtlich der obige Code diese Anforderung nicht erfüllen, da der Schlaf die Ausführung unterbricht". suspendiert die Ausführung von was dieser Signal-Handler oder ein Thread? –

+0

Für SIGINT kann der Signal-Handler in jedem der Threads innerhalb eines Prozesses ausgeführt werden. Wenn ein Signal-Handler ausgeführt wird, wird die normale Thread-Ausführung unterbrochen und wird nicht fortgesetzt, bis der Signal-Handler zurückkehrt. Wenn Sie also im Signal-Handler 'sleep' aufrufen, bedeutet dies, dass die normale Thread-Ausführung auch während der Sleep-Zeit unterbrochen ist. Ob das richtige Verhalten ist oder nicht, hängt von Ihren Anforderungen ab. – kaylum

Antwort

1

zu implementieren Wenn Sie den Faden weiter ausgeführt werden, verwenden alarm() später ein Aufwecken 10 Sekunden zu planen.

signal(SIGALRM, my_handler); 

void signal_handler(int sig_num) { 
    alarm(10); 
} 
Verwandte Themen