Réponses:
signal
n'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:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void my_handler(int s){
printf("Caught signal %d\n",s);
exit(1);
}
int main(int argc,char** argv)
{
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = my_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
pause();
return 0;
}
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
et sa_flags
.
Pour une application console Windows, vous souhaitez utiliser SetConsoleCtrlHandler pour gérer CTRL+ Cet CTRL+ BREAK.
Voir ici pour un exemple.
Vous devez attraper le signal SIGINT (nous parlons de POSIX, non?)
Voir la réponse de @Gab Royer pour sigaction.
Exemple:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
void my_handler(sig_t s){
printf("Caught signal %d\n",s);
exit(1);
}
int main(int argc,char** argv)
{
signal (SIGINT,my_handler);
while(1);
return 0;
}
void my_handler(sig_t s)
pour void my_handler(sig_atomic_t s)
.