在C语言中,对于错误有很多处理方式。然而,今天学习了信号处理,感觉这种处理方式十分灵活,特此记录。
关于信号处理的函数包含于头文件<signal.h>中。所谓的信号,多指出乎程序员意料的行为,包括程序本身的行为(即错误)和用户的行为。当有错误或者外部事件发生时,我们称产生了一个信号。
signal.h中定义了若干宏与相应的信号对应,比较常用的有:
宏名 | 含义 |
SIGABRT | 异常终止 |
SIGFPE | 在算术运算中发生错误 |
SIGILL | 无效指令 |
SIGINT | 中断 |
SIGSEGV | 无效存储访问 |
SIGTERM | 终止请求 |
其中,signal函数用于处理信号,将相应的信号和自己编写的函数关联,达到执行相应指令的目的。有点类似于事件侦听器。原型如下:
void (*signal(ing sig, void (*func)(int)))(int);
用法如下:
signal (SIGINT, handler);
另外,raise函数可以手工地产生一个信号,用法如下:
raise(SIGABRT); // raises the SIGABRT signal.
示例程序:
/* tsignal.c * To test signals. * By Eric Brown */ #include <signal.h> #include <stdio.h> #include <stdlib.h> void handler(int sig); int main(void) { signal(SIGFPE, handler); int x, y, result; printf("Please input two integer: "); scanf("%d%d", &x, &y); result = x / y; //signal(SIGABRT, handler); raise(SIGABRT); printf("Program run here!\n"); return 0; } void handler(int sig) { if (sig == SIGFPE) { printf("We get a SIGFPE signal.\n"); exit (EXIT_FAILURE); } if (sig == SIGABRT) { printf("We get a SIGABRT signal.\n"); } }
运行效果如下: