You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在捕获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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:54:33