2013-03-20 25 views
3

中重置alarm()一旦alarm(5)或者什麼秒鐘被啓動並且正在運行,在程序中的一段時間之後,如果發生某些動作,我需要重新設置報警到alarm(5)。我怎樣才能做到這一點?如何在c linux

是否有報警reset()

int flag=0; 
void alarmhand(int signal) 
{ 
    flag=1; 
    // printf("\n time out"); 
} 

void main() 
{ 
    signal(SIGALRM,alarmhand); 
    alarm (5); 
    while(1) 
    { 
    event_status(); 
    if(flag==1) 
     break; 
    } 
} 

void event_status() 
{ 
    int reset; 
    printf("reset 1=y/2=n :"); 
    scanf("%d",&reset); 
    if(reset==1) 
    { 
    // alarm.reset(5); 
    // HOW DO I RESET THE ALARM AGAIN TO 5 HERE ?? 
    } 
} 

回答

7

只需將新的報警和舊的將被取消:

alarm (5); 

Linux alarm man page,稍微轉述):

alarm()安排一個SIGALRM信號在指定的秒數內傳遞給呼叫進程。

如果指定秒數爲零,則不計劃新的警報。

無論如何,任何先前設置的警報都將被取消。

如前所述,任何當前報警由別的之前alarm()打電話取消。如果alarm()的參數爲零,則不會創建新的。

因此,alarm(0)將取消任何當前活動的警報,而alarm(5)將創建一個新的警報或將當前活動的警報重置爲5秒。

2

要取消未完成的alarm(),請使用alarm(0)。它的返回值告訴你從最後一次調用alarm()多少次未使用。當然,您可以自由設定新的鬧鈴。

-1

使用sigaction()系統調用並僅在啓動時處理報警信號。 使用ISR功能在需要時重置每個動作的警報。