如何在Linux下實(shí)現(xiàn)定時(shí)器_第1頁(yè)
如何在Linux下實(shí)現(xiàn)定時(shí)器_第2頁(yè)
如何在Linux下實(shí)現(xiàn)定時(shí)器_第3頁(yè)
如何在Linux下實(shí)現(xiàn)定時(shí)器_第4頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.如何在Linux下實(shí)現(xiàn)定時(shí)器在Linux實(shí)現(xiàn)一個(gè)定時(shí)器,不像Win32下那樣直觀。在Win32調(diào)用SetTimer就行了,在Linux下則沒(méi)有相應(yīng)函數(shù)可以直接調(diào)用。定時(shí)器作為一個(gè)常用的功能,在Linux當(dāng)然也有相應(yīng)實(shí)現(xiàn)。下面我們看看幾種常用的方法。 要實(shí)現(xiàn)定時(shí)器功能,最土的辦法實(shí)現(xiàn)莫過(guò)于用sleep/usleep來(lái)實(shí)現(xiàn)了。當(dāng)然,它會(huì)阻塞當(dāng)前線程,除了處理定時(shí)功能外,什么活也干不了。當(dāng)然要解決這個(gè)問(wèn)題不難,創(chuàng)建一個(gè)單獨(dú)的線程來(lái)負(fù)責(zé)定時(shí)器,其它線程負(fù)責(zé)正常的任務(wù)就行了。 要實(shí)現(xiàn)定時(shí)器功能,最簡(jiǎn)單的辦法就是ALARM信號(hào)。這種方法簡(jiǎn)單,也相應(yīng)的缺陷:用信號(hào)實(shí)現(xiàn)效率較低; 最小精

2、度為1秒,無(wú)法實(shí)現(xiàn)高精度的定義器。簡(jiǎn)單示例:i nclude <stdio.h>i nclude <signal.h> static void timer(int sig)    if(sig = SIGALRM)            printf("timern");         return; int main(int ar

3、gc, char* argv)    signal(SIGALRM, timer);     alarm(1);     getchar();     return 0; (setitimer和alarm有類似的功能,也是通過(guò)信號(hào)來(lái)實(shí)現(xiàn)) 最優(yōu)雅的方法是使用RTC機(jī)制。利用select函數(shù),你可以用單線程實(shí)現(xiàn)定時(shí)器,同時(shí)還可以處理其它任務(wù)。簡(jiǎn)單示例: i nclude <stdio.h>i nclude

4、<linux/rtc.h>i nclude <sys/ioctl.h>i nclude <sys/time.h>i nclude <sys/types.h>i nclude <fcntl.h>i nclude <unistd.h>i nclude <errno.h> int main(int argc, char* argv)    unsigned long i = 0;    unsigned long data = 0; &#

5、160;  int retval = 0;    int fd = open ("/dev/rtc", O_RDONLY);     if(fd < 0)            perror("open");        exit(errno);     

6、60;   /*Set the freq as 4Hz*/    if(ioctl(fd, RTC_IRQP_SET, 4) < 0)            perror("ioctl(RTC_IRQP_SET)");        close(fd);        exit(er

7、rno);        /*Set the freq as 4Hz*/    if(ioctl(fd, RTC_IRQP_SET, 4) < 0)            perror("ioctl(RTC_IRQP_SET)");        close(fd);    

8、;    exit(errno);         /* Enable periodic interrupts */    if(ioctl(fd, RTC_PIE_ON, 0) < 0)            perror("ioctl(RTC_PIE_ON)");      &#

9、160; close(fd);        exit(errno);         for(i = 0; i < 100; i+)            if(read(fd, &data, sizeof(unsigned long) < 0)        

10、60;           perror("read");            close(fd);            exit(errno);          

11、      printf("timern");        /* Disable periodic interrupts */    ioctl(fd, RTC_PIE_OFF, 0);    close(fd);     return 0;*調(diào)用setitimer安裝定時(shí)器:  它有三個(gè)參數(shù)第一個(gè)設(shè)ITIMER_REAL,第二和三個(gè)參數(shù)是新的時(shí)

12、鐘間隔和之前設(shè)置的時(shí)鐘間隔。  struct itimerval       struct timeval it_interval; /設(shè)為時(shí)鐘間隔       struct timeval it_value;   /設(shè)為第一次觸發(fā)的時(shí)鐘間隔,其實(shí)只被執(zhí)行一次,以后按照it_interval的值 下面是一個(gè)具體的例子i nclude <stdio.h&

13、gt;i nclude <time.h>i nclude <sys/time.h>i nclude <stdlib.h>i nclude <signal.h>int count = 0;void set_timer()        struct itimerval itv, oldtv;        itv.it_interval.tv_sec = 1;    &#

14、160;   itv.it_interval.tv_usec = 0;        itv.it_value.tv_sec = 5;        itv.it_value.tv_usec = 0;        setitimer(ITIMER_REAL, &itv, &oldtv);void sigalrm_handler(int sig)        count+;        printf("timer signal. %dn", count);int main()        signal(SIGALRM, si

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論