- 論壇徽章:
- 0
|
本帖最后由 LinuxJoin 于 2011-07-27 17:46 編輯
問題是這樣的,實(shí)現(xiàn)個(gè)timer定時(shí)器,200毫秒定時(shí)調(diào)用handler函數(shù) 打印信息,可是不知道這個(gè)timer與主線程main是什么關(guān)系,是兩個(gè)線程嗎?- #include <stdio.h>
- #include <unistd.h>
- #include <signal.h>
- #include <stdlib.h>
- #include <time.h>
- #define rdtsc(low,high) __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))
- void handler (int sig, siginfo_t * extra, void *cruft)
- {
- static last_i=0;
- unsigned int i, j;
- rdtsc(i,j);
- printf ("time:%u, %u, [%u] %uHZ \n", j, i, i-last_i, (i-last_i)*10/1000000);
- last_i = i;
- }
- int main ()
- {
- timer_t tt;
- int i=0;
- sigset_t sigset;
- sigfillset (&sigset);
- sigdelset (&sigset, SIGRTMIN);
- sigprocmask (SIG_SETMASK, &sigset, NULL);
- struct sigaction sa;
- sigfillset (&sa.sa_mask);
- sa.sa_flags = SA_SIGINFO;
- sa.sa_sigaction = handler;
- if (sigaction (SIGRTMIN, &sa, NULL) < 0)
- {
- perror ("sigaction failed ");
- exit (-1);
- }
- struct sigevent timer_event;
- struct itimerspec timer;
- timer.it_value.tv_sec = 0;
- timer.it_value.tv_nsec = 200 * 1000 * 1000;
- timer.it_interval.tv_sec = 0;
- timer.it_interval.tv_nsec = 200 * 1000 * 1000;
- timer_event.sigev_notify = SIGEV_SIGNAL;
- timer_event.sigev_signo = SIGRTMIN;
- timer_event.sigev_value.sival_ptr = (void *) &tt;
- if (timer_create (CLOCK_REALTIME, &timer_event, &tt) < 0)
- {
- perror ("timer_create failed");
- exit (-1);
- }
- if (timer_settime (tt, 0, &timer, NULL) < 0)
- {
- perror ("timer_settime failed");
- exit (-1);
- }
- while(1)
- {
- sleep(2);
- printf("sleep 2 seconds.\n");
- }
- return 0;
- }
復(fù)制代碼 為什么上面代碼運(yùn)行的結(jié)果是
time:21400, 86281621, [86281621] 862HZ
sleep 2 seconds.
time:21400, 670689030, [584407409] 1549HZ
sleep 2 seconds.
time:21400, 1258047490, [587358460] 1578HZ
sleep 2 seconds.
time:21400, 1845329486, [587281996] 1577HZ
sleep 2 seconds.
time:21400, 2432350852, [587021366] 1575HZ
.
.
.
而不是 handler被調(diào)用10次,即打印time 10次,然后sleep 2 seconds 一次
小弟感覺結(jié)果應(yīng)該是這樣的
time:21400, 2432350852, [587021366] 1575HZ
time:21400, 2432350852, [587021366] 1575HZ
.
.
.(10次)
sleep 2 seconds.
.
.
. |
|