Nun, es ist eine Qt-App, aber ich führe sie während der Entwicklung von der Konsole aus aus. (Dies ist Linux)
Scott
Antworten:
172
signalist nicht der zuverlässigste Weg, da er sich in den Implementierungen unterscheidet. Ich würde empfehlen, zu verwenden sigaction. Toms Code würde jetzt so aussehen:
Ja, es ist POSIX. Ich habe vergessen, der Frage Linux hinzuzufügen.
Scott
2
signal () verhält sich unterschiedlich, je nachdem, ob es dem BSD- oder SysV-Stil folgt. sigaction () ist vorzuziehen.
Asveikau
2
Ich weiß, dass es alt ist, aber dies wird nicht in g ++ (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1) 7.4.0 kompiliert. Ich musste ändern void my_handler(sig_t s)zu void my_handler(sig_atomic_t s).
JCmonteiro
1
Ja, das ist eine plattformabhängige Frage.
Wenn Sie ein Konsolenprogramm unter POSIX schreiben, verwenden Sie die Signal-API ( #include <signal.h>).
In einer WIN32-GUI-Anwendung sollten Sie die WM_KEYDOWNNachricht verarbeiten.
Antworten:
signal
ist nicht der zuverlässigste Weg, da er sich in den Implementierungen unterscheidet. Ich würde empfehlen, zu verwendensigaction
. Toms Code würde jetzt so aussehen:quelle
int s
es als Argument nehmen.sig_t
ist selbst ein Funktionszeigertyp.printf()
ist nicht asynchron-signal-sicher, kann also nicht im Signalhandler verwendet werden.sa_mask
und zu habensa_flags
.Für eine Windows-Konsolen-App möchten Sie SetConsoleCtrlHandler verwenden , um CTRL+ Cund CTRL+ zu verarbeiten BREAK.
Siehe hier für ein Beispiel.
quelle
Sie müssen das SIGINT- Signal abfangen (wir sprechen von POSIX, oder?)
Siehe @Gab Royers Antwort zur Unterschrift.
Beispiel:
quelle
void my_handler(sig_t s)
zuvoid my_handler(sig_atomic_t s)
.Ja, das ist eine plattformabhängige Frage.
Wenn Sie ein Konsolenprogramm unter POSIX schreiben, verwenden Sie die Signal-API (
#include <signal.h>
).In einer WIN32-GUI-Anwendung sollten Sie die
WM_KEYDOWN
Nachricht verarbeiten.quelle