2011-02-07 80 views
0

我遇到了似乎無法觸發的SIGALRM問題。我使用signal()而不是sigaction()來簡化代碼。發出警報()和C中的SIGALRM

其目的是讓一些循環讀取,但在x秒後,在再次讀取之前重新初始化所有變量。我用這個鬧鐘。

volatile sig_atomic_t restartBool; 

void catch_alarm(int sig) 
{ 
    fprintf(stderr, "ALARM CALLED\n"); 
    restartBool = 1; 
} 

int  main(void) 
{ 

    int n, fd_in = 0; 
    char newChar; 

    signal(SIGALRM, catch_alarm); 

    while (1) {      /* main loop */ 

      restartBool = 0; 

      // Set a timer before we start reading 
      alarm(2); 

      while (restartBool == 0 && (n = read(fd_in, &newChar, 1)) == 1) {  /* parse input */ 
       /* ..... */ 
      } 
      fprintf(stderr, "EXITED THE LOOP"); 

      // Cancel the alarm/timer 
      alarm(0); 
    } 
} 

那麼在catch_alarm()函數fprintf中()語句永遠不會被調用,我不知道爲什麼(我在Linux上運行)。

任何幫助將很大,

非常感謝你,

Jary

+3

-1代表假碼。代碼不會按原樣編譯,並且當我在`main`的開頭添加`int n,fd_in = 0,newChar;`時,它工作得很好(消息被打印)。 – 2011-02-07 23:46:46

回答

1

這很可能是你讀的是(左無字節)返回一個0的計時器熄滅很久以前。 IE瀏覽器,因爲你沒有數據,這個循環正在退出,然後你取消了警報(它還沒有關閉)。