Risposte:
signal
non è il modo più affidabile in quanto differisce nelle implementazioni. Consiglierei di usare sigaction
. Il codice di Tom ora dovrebbe apparire così:
#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
come argomento. sig_t
è esso stesso un tipo di puntatore a funzione.
printf()
non è sicuro per il segnale asincrono, quindi non può essere utilizzato all'interno del gestore del segnale.
sa_mask
e sa_flags
.
Per un'app console di Windows, si desidera utilizzare SetConsoleCtrlHandler per gestire CTRL+ Ce CTRL+ BREAK.
Vedi qui per un esempio.
Devi catturare il segnale SIGINT (stiamo parlando POSIX giusto?)
Vedi la risposta di @Gab Royer per la sigazione.
Esempio:
#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)
in void my_handler(sig_atomic_t s)
.