Respostas:
signal
não é a maneira mais confiável, pois difere nas implementações. Eu recomendaria usar sigaction
. O código de Tom agora ficaria assim:
#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
como argumento. sig_t
é em si um tipo de ponteiro de função.
printf()
não é seguro para sinal assíncrono, portanto não pode ser usado dentro do manipulador de sinal.
sa_mask
e sa_flags
.
Para um aplicativo de console do Windows, você deseja usar SetConsoleCtrlHandler para manipular CTRL+ Ce CTRL+ BREAK.
Veja aqui um exemplo.
Você tem que pegar o sinal SIGINT (estamos falando de POSIX, certo?)
Veja a resposta de @Gab Royer para sigação.
Exemplo:
#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)
para void my_handler(sig_atomic_t s)
.