2014-11-03 138 views
1

我的目標是製作一個每秒關閉的警報,以便在通過sigaction處理它時打印時間,因此每秒都會打印新時間。我在這段代碼的中間有一個循環,它計數到一個隨機數,但是我把它用來使這段代碼更加簡潔並且更容易看,因爲我相信問題在於我如何使用sigaction,因爲它會打印多個時間一秒鐘,但我只需要在這一秒輸出一行。sigaction捕捉SIGALRM

#include <stdio.h> 
#include <signal.h> 
#include <time.h> 
#include <unistd.h> 
#include <stdlib.h> 
void alarmPrint(int signum); 

time_t curtime; 

int main(){ 

    printf("Enter ^C to end the program:\n"); 

    struct sigaction sig; 

    sig.sa_handler = alarmPrint; 

    int count; 

    int final; 

    time(&curtime); 

    srandom(curtime); 

    while(1){ 

    time(&curtime); 

    alarm(1); 

    printf("\n"); 

    if(sigaction(SIGALRM, &sig, 0) == -1){ 

     printf("Error\n"); 

    } 

    } 

    return 0; 

} 


void alarmPrint(int signum){ 

    printf("current time is %s\n", ctime(&curtime)); 

} 
+2

那麼問題是什麼? – 2014-11-03 21:39:12

+0

注意這個錯字'time_t cur time;'應該是time_t curtime; – 2014-11-03 21:41:06

+0

這是如何正確使用sigaction捕捉SIGALRM信號時,我的理解是說alarm(1)意味着SIGALRM將在1秒內發送,sigaction將捕獲然後調用alarmPrint然後打印當前時間,因此此程序運行時間的每一秒都將被打印。然而,目前它每秒打印一次以上,這是我的問題出現的地方,sigaction和alarm是否正確地用於所需的輸出? – Konnor 2014-11-03 21:42:53

回答

1

正如其他人指出的那樣。

你應該把你的sigaction移動到循環外面,並且還要報警。

#include <stdio.h> 
#include <signal.h> 
#include <time.h> 
#include <unistd.h> 
#include <stdlib.h> 

void alarmPrint(int signum); 

int main(){ 

    int count; 
    int final; 

    printf("Enter ^C to end the program:\n"); 
    signal(SIGALRM, alarmPrint); 
    alarm(1); 

    while(1) { 
    /* do other stuff here */ 
    } 

    return 0; 

} 

void alarmPrint(int signum){ 
    time_t curtime; 

    time(&curtime); 
    printf("current time is %s", ctime(&curtime)); 
    alarm(1); 

} 

您還需要重置alarmPrint()功能中的警報,以便它在另一秒鐘內關閉。

最後ctime()已包含一個新行,所以打印時間時不需要一行。