c#include #include void handler1(int signum) { printf("Handler 1 is called.\n");}void handler2(int signum) { printf("Handler 2 is called.\n");}int main() { signal(SIGINT, handler1); signal(SIGTERM, handler2); while (1) { printf("Waiting for interrupt...\n"); sleep(1); } return 0;}
在上述代码中,我们注册了两个中断处理程序`handler1`和`handler2`。`handler1`用于处理`SIGINT`信号,`handler2`用于处理`SIGTERM`信号。在`main`函数中,我们通过`signal`函数将这两个中断与对应的处理程序关联起来。运行上述代码后,我们可以看到在终端中输出了"Waiting for interrupt..."。当我们按下`Ctrl+C`键时,会发生`SIGINT`中断,此时会调用`handler1`函数,输出"Handler 1 is called."。当我们使用`kill`命令发送`SIGTERM`信号时,会调用`handler2`函数,输出"Handler 2 is called."。如果在执行`handler1`函数的过程中,又发生了`SIGTERM`信号,那么当前的中断处理程序会被打断,转去处理新的中断。也就是说,`handler2`函数会覆盖`handler1`函数的执行,输出"Handler 2 is called."。当`handler2`函数执行完毕后,才会继续执行`handler1`函数,输出"Handler 1 is called."。在Linux内核中,当两个中断同时发生时,内核会根据中断的优先级来确定处理的顺序。优先级高的中断会先被处理,而优先级低的中断则会被延迟处理。此外,中断是可以嵌套的,在一个中断处理程序中,如果发生了另一个中断,当前的中断处理程序会被打断,转去处理新的中断。只有新的中断处理程序执行完毕后,才会恢复执行之前的中断处理程序。通过合理地设置中断的优先级和处理程序,可以有效地管理系统资源和提高系统的响应速度。