Eh bien, c'est une application Qt, mais je l'exécute depuis la console pendant le développement. (Ceci est Linux)
Scott
Réponses:
172
signaln'est pas le moyen le plus fiable car il diffère dans les implémentations. Je recommanderais d'utiliser sigaction. Le code de Tom ressemblerait maintenant à ceci:
Oui, c'est POSIX. J'ai oublié d'ajouter Linux à la question.
Scott
2
signal () se comporte différemment, selon qu'il suit le style BSD ou SysV. sigaction () est préférable.
asveikau
2
Je sais qu'il est ancien, mais cela ne compile pas dans g ++ (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1) 7.4.0. J'ai dû changer void my_handler(sig_t s)pour void my_handler(sig_atomic_t s).
jcmonteiro
1
Ouais, c'est une question dépendante de la plate-forme.
Si vous écrivez un programme console sur POSIX, utilisez l'API de signal ( #include <signal.h>).
Dans une application GUI WIN32, vous devez gérer le WM_KEYDOWNmessage.
Réponses:
signal
n'est pas le moyen le plus fiable car il diffère dans les implémentations. Je recommanderais d'utilisersigaction
. Le code de Tom ressemblerait maintenant à ceci:la source
int s
comme argument.sig_t
est lui-même un type de pointeur de fonction.printf()
n'est pas async-signal-safe, donc ne peut pas être utilisé dans le gestionnaire de signal.sa_mask
etsa_flags
.Pour une application console Windows, vous souhaitez utiliser SetConsoleCtrlHandler pour gérer CTRL+ Cet CTRL+ BREAK.
Voir ici pour un exemple.
la source
Vous devez attraper le signal SIGINT (nous parlons de POSIX, non?)
Voir la réponse de @Gab Royer pour sigaction.
Exemple:
la source
void my_handler(sig_t s)
pourvoid my_handler(sig_atomic_t s)
.Ouais, c'est une question dépendante de la plate-forme.
Si vous écrivez un programme console sur POSIX, utilisez l'API de signal (
#include <signal.h>
).Dans une application GUI WIN32, vous devez gérer le
WM_KEYDOWN
message.la source