2009-10-29 18 views

Respuesta

133

signal no es la forma más fiable, 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;  
} 
+1

Creo que my_handler debería tomar 'int s' como argumento. 'sig_t' es en sí mismo un tipo de puntero a función. –

+23

, etc. - es C, no C++. En C++ debe usar Abyx

+0

Funciona en OSX. En mi archivo main.mm, ni siquiera necesité incluir signal.h, stdlib.h, o unistd.h. Acabo de incluir stdio.hy Foundation/Foundation.h, y luego, si necesitaba hacer std :: cout cosas para generar un mensaje de apagado, incluí iostream. – Volomike

24

tienes que coger el SIGINT signal (estamos hablando POSIX ¿verdad?)

Ver @Gab Royer's respuesta para sigaction.

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; 

} 
+0

Sí, es POSIX. Olvidé agregar Linux a la pregunta. – Scott

+2

signal() se comporta de manera diferente, dependiendo de si sigue el estilo BSD o SysV. sigaction() es preferible. – asveikau

+0

Sí, ese código no funcionó para mí. sigaction lo hizo. – Matt

1

Sí, esta es una pregunta que depende de la plataforma.

Si está escribiendo un programa de consola en POSIX, utilice la API de señal (#include signal.h >).

En una aplicación GUI WIN32 debe manejar el mensaje WM_KEYDOWN.

41

Para una aplicación de consola de Windows, que desea utilizar para manejar SetConsoleCtrlHandlerCTRL +C y CTRL +PAUSA.

Consulte here para ver un ejemplo.

Cuestiones relacionadas