Respuestas:
signal
no es la forma más confiable, ya que difiere en las implementaciones. Yo recomendaría usar sigaction
. El código de Tom ahora se vería así:
#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
es en sí mismo un tipo de puntero de función.
printf()
no es seguro para la señal asíncrona, por lo que no se puede usar dentro del controlador de señal.
sa_mask
y sa_flags
.
Para una aplicación de consola de Windows, desea usar SetConsoleCtrlHandler para manejar CTRL+ Cy CTRL+ BREAK.
Ver aquí para un ejemplo.
Tienes que atrapar la señal SIGINT (estamos hablando de POSIX ¿verdad?)
Ver la respuesta de @Gab Royer para seguirction.
Ejemplo:
#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)
a void my_handler(sig_atomic_t s)
.