2009-10-29 20 views

Odpowiedz

133

signal nie jest najbardziej niezawodny sposób, ponieważ różni się w realizacji. Polecam używanie sigaction. Kod Toma wyglądałby teraz tak:

#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

Myślę, że my_handler powinien przyjąć 'int s' jako argument. 'sig_t' sam jest typem wskaźnika funkcji. –

+23

itd. - to C, nie C++. W C++ powinieneś użyć Abyx

+0

Działa na OSX. W pliku main.mm nie potrzebowałem nawet signal.h, stdlib.h ani unistd.h. Po prostu włączyłem stdio.h i Foundation/Foundation.h, a następnie, jeśli potrzebowałem zrobić std :: cout stuff dla wyprowadzenia komunikatu o zamknięciu, włączyłem iostream. – Volomike

24

Trzeba złapać SIGINT signal (mówimy POSIX prawda?)

See @Gab Royer's odpowiedź dla sigaction.

przykład:

#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

Tak, to POSIX. Zapomniałem dodać Linux do pytania. – Scott

+2

signal() zachowuje się inaczej, w zależności, czy jest zgodny ze stylem BSD czy SysV. Preferowane jest sigaction(). – asveikau

+0

Tak, ten kod nie działa dla mnie. sigaction zrobił. – Matt

1

Tak, to jest pytanie zależne od platformy.

Jeśli piszesz program konsoli na POSIX, użyj sygnału API (#include <signal.h>).

W aplikacji GUI WIN32 należy obsłużyć wiadomość WM_KEYDOWN.

Powiązane problemy