2017-06-07 70 views
0

Linux信號我有一個C程序是這樣:程序沒有響應從終端發送不連續打印的終端

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

現在,這些標誌將在處理程序SIGINT和SIGTSTP信號得到提升。終端只是顯示^ C和輸入Ctrl + C鍵或Ctrl + Z時^ Z,但條件代碼塊不被執行。
然而完全相同的程序,但如果我給一個printf象下面這樣:

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

該程序響應爲Ctrl + Z或Ctrl + C信號,並且將各個條件碼塊被執行。 有人可以解釋這種行爲嗎?我不知道爲什麼保持終端忙的東西被連續打印,使我的程序響應的信號,而不是相反。

+1

爲什麼不張貼的完整代碼,所以我們可以幫助? – cleblanc

+1

程序沒有響應到Linux的信號,我怎麼就知道只是看着while循環的骨架。發佈有問題的代碼和錯誤代碼,這將有助於理解您所面臨的問題。 – LethalProgrammer

+0

https://gist.github.com/schegde/fafc10fa6947c2bd738d3334198ba1f1#file-transfer-c –

回答

1

有條件的代碼塊,可以優化掉了,因爲編譯器不知道這些變量可以改變圈外。將標誌定義爲易失性,即

volatile int flag1; 
... 

這樣編譯器知道不對這些變量的值做任何假設。