程序没有响应从终端发送的linux信号而没有在终端上连续打印

时间:2017-06-07 19:13:23

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

1 个答案:

答案 0 :(得分:1)

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

SET NOCOUNT ON
GO
PRINT 'Start...'
:On Error exit

   :r C:\Queries\FTM.sql
   :r C:\Queries\FSF.sql


PRINT 'Finish...'
GO

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