Câu trả lời:
signalkhông phải là cách đáng tin cậy nhất vì nó khác nhau trong việc thực hiện. Tôi khuyên bạn nên sử dụng sigaction. Mã của Tom bây giờ sẽ trông như thế này:
#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đó làm đối số. sig_tbản thân nó là một loại con trỏ hàm.
printf()không an toàn async-signal, vì vậy không thể sử dụng bên trong bộ xử lý tín hiệu.
sa_maskvà sa_flags.
Đối với ứng dụng bảng điều khiển Windows, bạn muốn sử dụng SetConsoleCtrlHandler để xử lý CTRL+ Cvà CTRL+ BREAK.
Xem ở đây cho một ví dụ.
Bạn phải bắt được tín hiệu SIGINT (chúng ta đang nói POSIX phải không?)
Xem câu trả lời @Gab Royer hungs cho sigaction.
Thí dụ:
#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)để void my_handler(sig_atomic_t s).