使用信号处理函数:这是一种用于处理运行时异常的方法,就是在程序中注册一些信号处理函数,用于响应系统或用户发送的一些信号。信号是一种软件中断,用于通知进程发生了某些异常或事件。例如,当程序试图访问非法内存地址时,系统会发送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时,程序才退出循环。 |