https://blog.csdn.net/fengbingchun/article/details/92074191 signal.h是C标准函数库中的信号处理部分,定义了程序执行时如何处理不同的信号。信号用作进程间通信,报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT)。C++中的对应头文件是csignal。
C语言标准定义了6个信号,都定义在signal.h头文件中:
(1). SIGABRT:程序异常中止,如调用abort函数。
(2). SIGFPE:算术运算出错,如除数为0或溢出。
(3). SIGILL:非法函数映像,如非法指令。
(4). SIGINT:交互的用户按键请求,如同时按下Ctrl+C键。
(5). SIGSEGV:无效内存访问,段错误。
(6). SIGTERM:程序的中止请求。
signal.h可能还定义了其它信号,这依赖于具体实现。例如,类Unix系统还定义了15个以上的信号。Visual C++的C标准库只支持C语言标准规定的6个信号,即对信号处理只提供最小的支持。
signal函数:该函数设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作,其函数声明方式如下:
// Type of a signal handler typedef void (*__sighandler_t)(int); __sighandler_t signal(int __sig, __sighandler_t __handler);
下面是测试代码:
void process_exit(int sig) fprintf(stderr, "process exit: SIGINT: value: %d\n", sig); fprintf(stderr, "process exit: SIGFPE: value: %d\n", sig); fprintf(stderr, "process exit: SIGABRT: value: %d\n", sig); fprintf(stderr, "process exit: SIGILL: value: %d\n", sig); fprintf(stderr, "process exit: SIGSEGV: value: %d\n", sig); fprintf(stderr, "process exit: SIGTERM: value: %d\n", sig); fprintf(stderr, "process exit: value: %d\n", sig); std::this_thread::sleep_for(std::chrono::seconds(2)); fprintf(stdout, "please press to exit: Ctrl + c ... \n"); signal(SIGINT, process_exit); signal(SIGFPE, process_exit); signal(SIGILL, process_exit); signal(SIGABRT, process_exit); signal(SIGSEGV, process_exit); signal(SIGTERM, process_exit); fprintf(stdout, "caught SIGILL signal\n"); fprintf(stdout, "caught SIGTERM signal\n"); std::thread th(wait_ctrl_c); if (signal(SIGILL, signal_sigill) == SIG_ERR) { fprintf(stdout, "cannot handle SIGILL\n"); fprintf(stdout, "yyyyy\n"); fprintf(stdout, "c = %d\n", c); int test_signal_SIGSEGV() fprintf(stdout, "a[3] = %d\n", a[-1111111]); int test_signal_SIGTERM() if (signal(SIGTERM, signal_sigterm) == SIG_ERR) { fprintf(stdout, "cannot handle SIGTERM\n"); fprintf(stdout, "xxxxx\n"); int test_signal_SIGABRT()
测试test_signal_SIGINT时的输出结果如下:
GitHub: https://github.com/fengbingchun/Messy_Test
|