Câu trả lời:
signal
khô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_t
bả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_mask
và 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)
.