使用信号处理函数:这是一种用于处理运行时异常的方法,就是在程序中注册一些信号处理函数,用于响应系统或用户发送的一些信号。信号是一种软件中断,用于通知进程发生了某些异常或事件。例如,当程序试图访问非法内存地址时,系统会发送SIGSEGV信号;当用户按下Ctrl-C键时,系统会发送SIGINT信号;当程序执行除零操作时,系统会发送SIGFPE信号等。C语言提供了signal函数来设置信号处理函数,其语法为:
- void (*signal(int signum, void (*handler)(int)))(int);
其中signum是要处理的信号的编号,handler是要设置的信号处理函数的指针。如果handler为SIG_IGN,则表示忽略该信号;如果handler为SIG_DFL,则表示恢复该信号的默认处理方式。signal函数返回一个指针,指向之前设置的信号处理函数。例如:
- #include <stdio.h>
- #include <signal.h>
- // 定义一个信号处理函数
- void handler(int signum) {
- // 打印收到的信号编号
- printf("Received signal %d\n", signum);
- }
- int main() {
- // 设置SIGINT信号的处理函数为handler
- signal(SIGINT, handler);
- // 循环等待用户输入
- while (1) {
- char c = getchar();
- // 如果输入q,则退出循环
- if (c == 'q') {
- break;
- }
- }
- return 0;
- }
运行结果:
- ^CReceived signal 2
- ^CReceived signal 2
- q
可以看到,当用户按下Ctrl-C键时,程序不会终止,而是调用了自定义的信号处理函数,并打印了收到的信号编号(2表示SIGINT)。当用户输入q时,程序才退出循环。
|