2009-10-29 6 views

Répondre

133

signal n'est pas le moyen le plus fiable car il est différent 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;  
} 
+1

Je pense que my_handler devrait prendre 'int s' comme argument. 'sig_t' est lui-même un type de pointeur de fonction. –

+23

, etc - c'est C, pas C++. En C++, vous devez utiliser Abyx

+0

Fonctionne sur OSX. Dans mon fichier main.mm, je n'avais même pas besoin d'inclure signal.h, stdlib.h ou unistd.h. J'ai juste inclus stdio.h et Foundation/Foundation.h, et si j'avais besoin de faire des trucs std :: cout pour sortir un message d'arrêt, j'ai inclus iostream. – Volomike

24

Vous devez attraper le SIGINT signal (nous parlons Posix droit?)

Voir @Gab Royer's réponse 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; 

} 
+0

Oui, c'est POSIX. J'ai oublié d'ajouter Linux à la question. Le signal() – Scott

+2

se comporte différemment, selon qu'il suit le style BSD ou SysV. sigaction() est préférable. – asveikau

+0

Oui, ce code n'a pas fonctionné pour moi. sigaction a fait. – Matt

1

Oui, c'est une question dépendante de la plateforme.

Si vous écrivez un programme de console sur POSIX, utilisez le signal API (#include <signal.h>).

Dans une application WIN32 GUI, vous devez gérer le message WM_KEYDOWN.

41

Pour une application console Windows, vous souhaitez utiliser SetConsoleCtrlHandler pour gérer CTRL +C et CTRL +PAUSE. Pour un exemple, voir here.

Questions connexes