2014-09-11 37 views
0
#include <stdio.h> 
#include <sys/time.h> 
#include <unistd.h> 
#include <signal.h> 


const struct itimerval nak_timer={{20,10} , {20,10} }; 
struct itimerval old_value = {{10,0},{10,0}}; 
sigset_t set; 

int main() 
{ 

    int rc , i=0; 
    void NAKTime(int signal); 
    //Register a signal handler 
    sigemptyset(&set); 
    sigaddset(&set,SIGALRM); 
    sigset(SIGALRM , NAKTime); 
    //Create a Timer 
    rc = setitimer(ITIMER_REAL , &nak_timer,&old_value); 
    if(1 == rc) 
    { 
     printf("\nError in execution of Timer \n"); 
     return 1; 
    } 
    printf("Timer function executed\n"); 
    return 0; 
} 

void NAKTime(int signal) 
{ 
    printf("Entered NAKTime Function()\n"); 
    if(signal == SIGALRM) 
     printf("\nFunction NAKTime Called!!\n"); 
} 

在執行setitimer(...)時,必須調用NAKTime函數。但它沒有被調用。我試圖用SIGINT等其他信號測試NAKTime,它工作得很好。我不確定我是否在setitimer()函數中丟失了某些東西。SIGALRM信號未生成。在我的代碼中,函數NAKTime沒有被調用

+1

OT:不要在signal handers中使用'printf()',因爲它不能保證異步信號安全。 – alk 2014-09-11 07:59:29

+0

但它適用於SIGINT信號 – 2014-09-11 20:04:18

+0

您的用於NakTime()函數的原型被隱藏在main()函數中,所以在NakTime()函數的聲明中沒有看到。 – user3629249 2014-09-12 05:06:48

回答

2

您已設置鬧鐘......但警報響起之前,你的程序退出...

把「睡眠(60)」,如下所示:

printf("Timer function executed\n"); 
sleep(60); 
printf("After sleep\n"); 
return 0;` 

您現在應該看到它的作品。