請幫助我,我想在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");
}
}
您需要至少在main()之前列出處理函數的定義,否則編譯器不知道它存在。 SIG從哪裏來?它應該代表什麼?你忘了包含一些頭文件嗎? –
謝謝mike.I已經把main()之前的handler()。一個錯誤消失了。剩下的錯誤是:'SIG'未申報。 –
注意,從信號處理程序中調用一個'printf'是不好的做法(未定義的行爲)。閱讀'signal(7)'手冊頁瞭解異步信號安全功能。 –