【问题标题】:Program not responding to linux signals sent from terminal without continuous printing on terminal程序不响应从终端发送的linux信号而没有在终端上连续打印
【发布时间】:2017-06-07 19:13:23
【问题描述】:

我有一个 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 信号,执行相应的条件代码块。 有人可以解释这种行为吗?我不知道为什么让终端忙于连续打印的东西,让我的程序响应信号,而不是其他的。

【问题讨论】:

  • 为什么不发布完整代码以便我们提供帮助?
  • 程序没有响应Linux信号,我怎么知道只看骨架while循环。贴出有问题的代码和错误代码,这将有助于理解你面临的问题。
  • rio_writen 和 rio_readnb 是从网络套接字写入和读取的函数。
  • 尝试将标志定义为 volatile。

标签: c linux signal-handling


【解决方案1】:

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

volatile int flag1;
...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2020-06-08
    • 2022-11-02
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多