Antworten:
signal
ist 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 s
es als Argument nehmen. sig_t
ist selbst ein Funktionszeigertyp.
printf()
ist nicht asynchron-signal-sicher, kann also nicht im Signalhandler verwendet werden.
sa_mask
und 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)
.