如何在捕获SIGINT信号时打印消息?附C语言实现代码
捕获SIGINT信号并打印提示消息的C语言实现
我来帮你把这段代码补全,实现捕获SIGINT(也就是按下Ctrl+C时触发的信号)并打印提示消息的功能。下面是完整可运行的代码:
#include <stdio.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> /* 一个仅向标准错误输出打印消息的信号处理函数 */ void handler(int code) { fprintf(stderr, "Signal %d caught - 你按下了Ctrl+C哦!\n", code); } int main() { // 声明sigaction函数使用的结构体: struct sigaction newact; // 指定使用handler函数处理信号: newact.sa_handler = handler; // 使用默认标志: newact.sa_flags = 0; // 初始化信号掩码:清空掩码,处理信号时不额外阻塞其他信号 sigemptyset(&newact.sa_mask); // 注册SIGINT信号的处理函数,检查是否注册成功 if (sigaction(SIGINT, &newact, NULL) == -1) { perror("sigaction failed"); exit(EXIT_FAILURE); } // 让程序保持运行,等待信号触发 fprintf(stdout, "程序正在运行,按下Ctrl+C测试信号捕获...\n"); while (1) { sleep(1); } return 0; }
关键部分说明:
- 信号处理函数
handler:当SIGINT信号被捕获时,系统会调用这个函数,我们在这里用fprintf向标准错误输出打印提示信息(用stderr是因为它不会被缓冲,消息能立即显示)。 sigaction结构体配置:sa_handler:指定信号触发时要调用的处理函数。sa_flags:设为0表示使用默认的信号处理行为。sa_mask:通过sigemptyset清空这个掩码,意味着处理SIGINT信号时,不会额外阻塞其他信号(你也可以根据需求用sigaddset添加要阻塞的信号)。
sigaction调用:这个函数用来注册信号处理逻辑,我们指定处理SIGINT信号,传入配置好的newact结构体。如果调用失败(返回-1),用perror打印错误信息并退出程序。- 保持运行的循环:最后加了一个无限循环(配合
sleep避免占用过高CPU),这样程序不会立即退出,我们才能在终端按下Ctrl+C来触发SIGINT信号进行测试。
编译运行这段代码后,按下Ctrl+C就能看到我们自定义的提示消息啦!
内容的提问来源于stack exchange,提问作者teemo ammo
相关产品推荐
相关产品推荐

