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

基于示例实现SIGINT信号触发次数统计函数的技术问询

关于SIGINT信号处理:从统计次数到忽略信号的实现

你这段代码确实实现了统计SIGINT(Ctrl+C触发)信号触发次数的功能,而非原本意图的忽略该信号。咱们来拆解下代码逻辑,再看看如何修改才能实现忽略SIGINT的需求:

现有代码的功能解析

先把你给出的代码补全为完整可运行的版本:

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

sig_atomic_t sigint_count = 0;

void handler (int signal_number) {
    ++sigint_count;
    printf ("SIGINT was raised %d times\n", sigint_count);
}

int main () {
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = handler;
    // 注册SIGINT信号的自定义处理函数
    sigaction(SIGINT, &sa, NULL);

    printf("Press Ctrl+C to trigger SIGINT, press Ctrl+D to exit\n");
    // 让程序保持运行状态,等待信号触发
    while (1) {
        pause();
    }
    return 0;
}

关键细节说明:

  • sig_atomic_t 是C标准定义的原子数据类型,专门用于信号处理场景——确保在信号处理函数中对变量的递增操作不会被中断,避免出现竞态条件导致计数错误。
  • 你给SIGINT绑定了自定义的handler函数,每次用户按下Ctrl+C发送SIGINT时,系统就会调用这个函数,从而实现了统计触发次数的效果,而非忽略信号。

如何修改实现忽略SIGINT信号

如果你的目标是让程序完全忽略Ctrl+C的中断信号,只需要将信号处理行为设置为SIG_IGN(忽略)即可,这里推荐两种实现方式:

方式1:使用signal接口(简单但兼容性稍弱)

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

int main () {
    // 将SIGINT的处理行为设置为忽略
    signal(SIGINT, SIG_IGN);

    printf("SIGINT is ignored now — pressing Ctrl+C won't terminate the program. Press Ctrl+D to exit.\n");
    while (1) {
        pause();
    }
    return 0;
}

方式2:使用sigaction接口(更推荐,跨平台行为更一致)

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main () {
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = SIG_IGN;
    // 注册忽略SIGINT的处理规则
    sigaction(SIGINT, &sa, NULL);

    printf("SIGINT is ignored now — pressing Ctrl+C won't terminate the program. Press Ctrl+D to exit.\n");
    while (1) {
        pause();
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者João

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:34:29