2016-09-07 79 views
0

的信號和標誌在循環不同的行爲處理這個問題是基於一個問題,我昨天問: In C, linux, about kill signal and sleep() in loop下,在Mac上,對不同設備

這些代碼是我所有代碼的一部分。

int flag=0; 

void sigint(int sig){ 
    flag=1; 
} 


void alive(void) { 
    signal(SIGINT, sigint); 
    while(1){ 
     //printf("%d\n",out); 
     //pause(); 
     //sleep(1); 
     if(flag==1){ 
      printf("no\n"); 
      flag=0; 
     } 
    } 
} 

技術上我想要的是當我按ctrl-c程序可以輸出「no」。 昨天,在我的Mac上,我運行這些代碼,它不能輸出任何東西,然後我添加睡眠(1),它工作正常,以及添加暫停() 我以爲是這樣。事實上,這是我的教授留給我們在sunlab系統中完成的任務的一部分。在我的sunlab帳戶(Linux平臺)上覆制這些代碼後。運行。輸出如下:

^Cno 
^C 

我只能用SIGINT信號只有一次,當按下Ctrl-C來第二次就退出,我不知道爲什麼。 我的朋友給我看他的代碼,他的代碼就像我在這裏附上的,沒有暫停或睡覺,只用於while(1)或(;;;)。並且在他的sunlab賬戶上運行良好。

這裏我提到了三個設備。我需要使用pause()或sleep(1),並且可以實現我想要的功能。一些似乎正確的答案在這裏:In C, linux, about kill signal and sleep() in loop

我的sunlab帳戶:第二個ctrl-c後退出,可以在第一個ctrl-c後輸出'no'。存在暫停()不會影響我的結果明顯

我的朋友sunlab帳號:效果很好。暫停()的存在並不影響我的結果明顯 爲什麼不同。

供給:根據我的教授的話,第三個應該是對的。

+0

嘗試將標誌聲明爲volatile。我懷疑C編譯器是否將該標誌== 1退出循環,否則。 –

回答

0

我知道了,我沒有重置信號()。爲什麼沒有人告訴我。

void sigint(int sig){ 
    flag=1; 
    signal(SIGINT, sigint); 
} 
相關問題