Antworten:
signalist nicht der zuverlässigste Weg, da er sich in den Implementierungen unterscheidet. Ich würde empfehlen, zu verwenden sigaction. Toms Code würde jetzt so aussehen:
#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 ses als Argument nehmen. sig_tist selbst ein Funktionszeigertyp.
printf()ist nicht asynchron-signal-sicher, kann also nicht im Signalhandler verwendet werden.
sa_maskund zu haben sa_flags.
Für eine Windows-Konsolen-App möchten Sie SetConsoleCtrlHandler verwenden , um CTRL+ Cund CTRL+ zu verarbeiten BREAK.
Siehe hier für ein Beispiel.
Sie müssen das SIGINT- Signal abfangen (wir sprechen von POSIX, oder?)
Siehe @Gab Royers Antwort zur Unterschrift.
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;
}
void my_handler(sig_t s)zu void my_handler(sig_atomic_t s).