2012-10-09 7 views
0

請幫助我,我想在ubunto中使用c實現計時器。我有寫的代碼,但它給出了兩個錯誤。我正在使用gcc的-lrt選項編譯它。 我得到的錯誤是: timer1.c:在函數'main'中: timer1.c:18:52:錯誤:'SIG'未聲明(首次在此函數中使用) timer1.c:18:52:note :21::23:錯誤:每個未聲明的標識符是爲它出現在 timer1.c每個功能只報告一次未聲明(在一次使用此功能)「處理程序」我想在Ubuntu中實現使用c的計時器,但接收聲明的錯誤

我的代碼是:

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

timer_t timerid; 

int main(int argc, char *argv[]) 
{ 


      struct sigevent sev; 
      struct itimerspec its; 
      long long freq_nanosecs; 
      sigset_t mask; 
      struct sigaction sa; 
    printf("Establishing handler for signal %d\n", SIG); 

    sa.sa_flags = SA_SIGINFO; 
    sa.sa_sigaction = handler; 
    sigemptyset(&sa.sa_mask); 


    sev.sigev_notify = SIGEV_SIGNAL; 
    sev.sigev_signo = SIG; 
    sev.sigev_value.sival_ptr = &timerid; 

printf("timer ID is 0x%lx\n", (long) timerid); 
// timer_create(CLOCKID, &sev, &timerid); 
    /* Start the timer */ 

    its.it_value.tv_sec = 1000; 
    its.it_value.tv_nsec =0; 
    its.it_interval.tv_sec = its.it_value.tv_sec; 
    its.it_interval.tv_nsec = its.it_value.tv_nsec; 

    timer_settime(timerid,0, &its, NULL); 
    sleep(10); 


} 


static void handler(int sig, siginfo_t *si, void *uc) 
{ 
    if(si->si_value.sival_ptr != &timerid) 
    { 
     printf("Stray signal\n"); 
     } 
    else 
    { 
     printf("Caught signal from timer\n"); 
     } 


} 
+2

您需要至少在main()之前列出處理函數的定義,否則編譯器不知道它存在。 SIG從哪裏來?它應該代表什麼?你忘了包含一些頭文件嗎? –

+0

謝謝mike.I已經把main()之前的handler()。一個錯誤消失了。剩下的錯誤是:'SIG'未申報。 –

+0

注意,從信號處理程序中調用一個'printf'是不好的做法(未定義的行爲)。閱讀'signal(7)'手冊頁瞭解異步信號安全功能。 –

回答

1

SIG未申報,因爲您從不申報,因爲我們不知道應該如何解決,所以我們無法告訴您。 handler由於您忘記了前向聲明而未聲明。把函數簽名的後面跟一個分號放在它使用的函數前面。

static void handler(int sig, siginfo_t *si, void *uc); 

int main(int argc, char *argv[]) 
{ 
    ... 
+0

我已經宣佈SIG現在......現在我收到錯誤: 函數'_start': (.text + 0x20):未定義的引用'main' collect2:ld返回1退出狀態 –

+0

聽起來像你欺騙了前向聲明。 –

+0

不,我忘了代碼宏,因爲SIGRTMIN是在其他一些頭文件中定義的 –

相關問題