利用Linux/UNIX的软中断信号,编写一段C语言程序完成:显示数字1到100,在程序运行中如果捕获到一个SIGINT信号,则转去执行一段显示当前系统时间的程序。在编程中要考虑到信号被复位的情况,使程序能够实现多次被打断却多次的恢复执行。
时间: 2024-11-04 17:14:58 浏览: 7
在Linux/Unix系统中,我们可以使用信号处理机制结合C语言来实现这个功能。首先,需要了解`signal()`函数用于注册信号处理器,而`sigaction()`函数可以提供更精细的控制,包括设置信号处理器的行为。下面是一个简单的示例程序:
```c
#include <stdio.h>
#include <signal.h>
#include <time.h>
void display_numbers(int signum) {
for (int i = 1; i <= 100; ++i) {
printf("%d ", i);
if (signum == SIGINT && !handled_signal) { // 检查是否收到SIGINT且未处理过
handled_signal = true;
show_time();
}
}
}
void show_time() {
time_t now;
struct tm *ltm;
time(&now);
ltm = localtime(&now);
printf("\nCaught signal, displaying current time: %04d-%02d-%02d %02d:%02d:%02d\n",
ltm->tm_year + 1900, ltm->tm_mon + 1, ltm->tm_mday,
ltm->tm_hour, ltm->tm_min, ltm->tm_sec);
}
bool handled_signal = false; // 标记信号是否已处理
int main() {
// 注册SIGINT处理器
struct sigaction act, old_action;
act.sa_handler = display_numbers;
sigfillset(&act.sa_mask); // 设置接收所有信号
act.sa_flags = 0;
if (sigaction(SIGINT, &act, &old_action) == -1) {
perror("Setting signal handler");
return 1;
}
while (!handled_signal) { // 循环直到捕获并处理了SIGINT
continue;
}
// 如果已经处理过,恢复默认行为
act.sa_handler = old_action.sa_handler;
sigemptyset(&act.sa_mask);
act.sa_flags = old_action.sa_flags;
if (sigaction(SIGINT, &act, NULL) == -1) {
perror("Restoring default signal handler");
return 1;
}
printf("\nProgram interrupted, exiting...\n");
return 0;
}
```
在这个程序中,我们首先定义了一个`display_numbers`函数来处理数字显示和信号检查。当接收到SIGINT时,会调用`show_time`函数,并设置标志`handled_signal`表示已处理。然后主循环等待信号发生。一旦信号被处理,我们就恢复原信号处理器(如果没有改变则直接退出)。
阅读全文