2009-10-29 8 views

Antwort

133

signal ist nicht der zuverlässigste Weg, wie es in Implementierungen unterscheidet. Ich würde empfehlen, sigaction zu verwenden. Toms Code würde jetzt so aussehen:

+1

Ich denke, my_handler sollte 'int s' nehmen, da es Argument ist. 'sig_t' ist selbst ein Funktionszeigertyp. –

+23

, etc - es ist C, nicht C++. In C++ sollten Sie verwenden Abyx

+0

Works on OSX. In meiner main.mm-Datei musste ich nicht einmal signal.h, stdlib.h oder unistd.h einbeziehen. Ich habe gerade stdio.h und Foundation/Foundation.h hinzugefügt, und dann, wenn ich std :: cout Sachen für die Ausgabe einer Nachricht zum Herunterfahren tun musste, habe ich Iostream. – Volomike

24

Sie haben die SIGINT zu fangen signal (wir sprechen POSIX nicht wahr?)

See @Gab Royer's Antwort für sigaction.

Beispiel:

#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

Ja, es ist POSIX. Ich habe vergessen, Linux zu der Frage hinzuzufügen. – Scott

+2

signal() verhält sich anders, abhängig davon, ob es dem BSD- oder SysV-Stil folgt. sigaction() ist vorzuziehen. – asveikau

+0

Ja, dieser Code hat bei mir nicht funktioniert. sigaction hat es getan. – Matt

1

Ja, das ist eine plattformabhängige Frage.

Wenn Sie ein Konsolenprogramm unter POSIX schreiben, verwenden Sie die Signal-API (#include <signal.h>).

In einer WIN32-GUI-Anwendung sollten Sie die WM_KEYDOWN-Nachricht behandeln.

41

Für eine Windows-Konsole app, möchten Sie SetConsoleCtrlHandler verwenden CTRL +C und CTRL +BREAK zu behandeln.

Siehe here für ein Beispiel.

Verwandte Themen