【问题标题】:Why doensn't Ctrl+C doesn't work in my terminal?为什么 Ctrl+C 在我的终端中不起作用?
【发布时间】:2021-12-18 18:51:53
【问题描述】:

我有以下问题:

我正在 main 中创建两个线程。这些线程永远不会停止(它们一直在监听消息)。

所以,在 main 中,创建这两个线程后,我有这个 sn-p 代码来保持程序运行:

for (;;)
{
    sleep(10);
}
return 0;

它可以工作,但问题是当我在终端中执行程序时,Ctrl+C 不允许我退出程序。我必须用Ctrl+\ 退出。我有这个功能(不是我做的)。问题出在哪里?

void app_signal_handler(int sig_num)
{
    if (sig_num == SIGINT) {
        printf("SIGINT signal!\n");
    }
    if (sig_num == SIGTERM) {
        printf("SIGTERM signal!\n");
    }
    app_running = false;
}

char app_sigaltstack[SIGSTKSZ];
int app_setup_signals(void)
{
    stack_t sigstack;
    struct sigaction sa;
    int ret = -1;

    sigstack.ss_sp = app_sigaltstack;
    sigstack.ss_size = SIGSTKSZ;
    sigstack.ss_flags = 0;
    if (sigaltstack(&sigstack, NULL) == -1) {
        perror("signalstack()");
        goto END;
    }

    sa.sa_handler = app_signal_handler;
    sa.sa_flags = SA_ONSTACK;
    if (sigaction(SIGINT, &sa, 0) != 0) {
        perror("sigaction()");
        goto END;
    }
    if (sigaction(SIGTERM, &sa, 0) != 0) {
        perror("sigaction()");
        goto END;
    }

    ret = 0;
END:
    return ret;
}

【问题讨论】:

  • 请提供minimal reproducible example。 app_running 如何在代码的其他地方使用(如果有的话)?
  • 当你按下Ctrl+C时,你的程序会显示什么吗?
  • 你的for 循环不应该是for(;app_running;)?
  • 另请注意,在信号处理程序中调用printf 严格来说是非法,尽管许多平台都支持它。
  • for(;app_running;) 这就是答案!非常感谢!

标签: c linux terminal


【解决方案1】:

你从不使用app_running。替换

for (;;)
{
    sleep(10);
}

与

while (app_running)
{
    sleep(10);
}

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多