Jawaban:
signal
bukan cara yang paling dapat diandalkan karena berbeda dalam implementasi. Saya akan merekomendasikan menggunakan sigaction
. Kode Tom sekarang akan terlihat seperti ini:
#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
argumen. sig_t
itu sendiri merupakan tipe pointer fungsi.
printf()
tidak async-signal-safe, jadi tidak dapat digunakan di dalam handler sinyal.
sa_mask
dan sa_flags
.
Untuk aplikasi konsol Windows, Anda ingin menggunakan SetConsoleCtrlHandler untuk menangani CTRL+ Cdan CTRL+BREAK .
Lihat di sini untuk contoh.
Anda harus menangkap sinyal SIGINT (kita berbicara POSIX kan?)
Lihat jawaban @Gab Royer untuk sigaction.
Contoh:
#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)
ke void my_handler(sig_atomic_t s)
.