c - 程序不响应终端发送的 linux 信号而无需在终端上连续打印

标签 c linux signal-handling

我有一个 C 程序,如下所示:

while(1){
    if(flag1){
         ...
    }
    if(flag2){
         ...
    }
}

现在这些标志将在 SIGINT 和 SIGTSTP 信号的处理程序中引发。输入Ctrl+C或Ctrl+Z时,终端只显示^C和^Z,但不执行条件代码块。
然而,完全相同的程序,但如果我给出如下所示的 printf:

while(1){
    printf("  ");
    if(flag1){
         ...
    }
    if(flag2){
         ...
    }
}

程序响应Ctrl+Z或Ctrl+C信号,执行各自的条件代码块。 有人可以解释这种行为吗?我不确定为什么让终端忙于连续打印一些东西,让我的程序响应信号,而不是其他方式。

最佳答案

条件代码块可以被优化掉,因为编译器不知道这些变量可以在循环之外改变。将标志定义为易变的,即

volatile int flag1;
...

这样编译器就知道不对这些变量的值做出任何假设。

关于c - 程序不响应终端发送的 linux 信号而无需在终端上连续打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44421013/

相关文章:

c - 如何在c中加载包含机器学习的pickle文件?

linux - 如何以最少的击键启动 Bash 脚本

linux - 关闭洋泾浜对话窗口中的选项卡

c - 从信号处理程序上下文获取 ARC 平台的回溯跟踪

c - 如何在 C 中将 char 数组转换为普通 char

c - 我在调试 Visual Studio 2015 时遇到错误

c - 当收到来自“killall”或 "kill -p pid"的终止信号时,如何在退出程序之前执行处理函数?

c - C中的进程同步

c - 如何使用 exec() 从另一个 c 程序运行一个 c 程序

Linux tcp 服务器无法绑定(bind)到 close_wait 端口