Linux 定時器設定

來源:互聯網
上載者:User

函數alarm設定的定時器只能精確到秒,而以下函數理論上可以精確到微妙:

#include <sys/select.h>

#include <sys/time.h>

int getitimer(int which, struct itimerval*value);

int setitimer(int which, const structitimerval *value, struct itimerval *ovalue);

函數setitimer可以提供三種定時器,它們相互獨立,任意一個定時完成都將發送定時訊號到進程,並且自動重新計時。參數which確定了定時器的類型,訊號發送ITIMER_REAL 定時真即時間,與alarm類型相同。 SIGALRM ITIMER_VIRT 定時進程在使用者態下的實際執行時間。SIGVTALRMITIMER_PROF 定時進程在使用者態和核心態下的實際執行時間。 SIGPROF 這三種定時器定時完成時給進程發送的訊號各不相同,其中ITIMER_REAL類定時器發送SIGALRM訊號,ITIMER_VIRT類定時器發送SIGVTALRM訊號,ITIMER_REAL類定時器發送SIGPROF訊號。

函數alarm本質上設定的是低精確、非重載的ITIMER_REAL類定時器,它只能精確到秒,並且每次設定只能產生一次定時。函數setitimer設定的定時器則不同,它們不但可以計時到微妙(理論上),還能自動迴圈定時。

在一個Unix進程中,不能同時使用alarm和ITIMER_REAL類定時器。

結構itimerval描述了定時器的組成:

struct itimerval {   

struct tim. it_interval;    /* 下次定時取值 */   

struct tim. it_value;       /* 本次定時設定值 */

}   

結構tim.描述了一個精確到微妙的時間:

struct tim. {   

long   tv_sec;                 /* 秒(1000000微秒) */   

long   tv_usec;                 /* 微妙 */

}

函數setitimer設定一個定時器,參數value指向一個itimerval結構,該結構決定了設定的定時器資訊,結構成員it_value指定首次定時的時間,結構成員it_interval指定下次定時的時間。定時器工作時,先將it_value的時間值減到0,發送一個訊號,再將it_value賦值為it_interval的值,重新開始定時,如此反覆。如果it_value值被設定為0,則定時器停止定時;如果it_value值不為0但it_interval值為0,則定時器在一次定時後終止。函數setitimer調用成功時返回0,否則返回-1,參數ovalue如果不為空白,返回上次的定時器狀態。函數getitimer擷取當前的定時器狀態,整型參數which指定了讀取的定時器類型,參數value返回定時器狀態。函數調用成功返回0,否則返回-1。

 

 

例1.           設定一個定時器,每2.5秒產生一個SIGALRM訊號。

答:將itimerval結構的成員it_interval和成員it_value均賦值為2.5秒即可:

Struct itimerval value;

value.it_value.tv_sec=2;

value.it_value.tv_usec=500000;

value.it_interval.tv_sec=2;

value.it_interval.tv_usec=500000;

setitimer(ITIMER_REAL, &value, NULL);

函數setitimer設定的定時器可以重複定時,無需多次調用。

例2.           設定一個定時器,進程在使用者態下執行1秒鐘後發出首次訊號,以後進程每在使用者態下執行3秒鐘,發送一個訊號。

答:將itimerval結構的成員it_value均賦值為1秒,成員it_interval賦值為3秒即可:structitimerval value;

value.it_value.tv_sec=1;

value.it_value.tv_usec=0;

value.it_interval.tv_sec=3;

value.it_interval.tv_usec=0;

setitimer(ITIMER_VIRT, &value, NULL);

例3.           取消一個ITIMER_PROF類定時器。

答:將itimerval結構的成員it_value均賦值為0秒即可:

struct itimerval value;

value.it_value.tv_sec=1;

value.it_value.tv_usec=0;

setitimer(ITIMER_PROF, &value, NULL);

例4.           設定一個定時1.5秒的真即時間定時器,它僅發送一次訊號就自動取消。

答:將itimerval結構的成員it_value均賦值為1.5秒,成員it_interval賦值為0秒即可:struct itimerval value;

value.it_value.tv_sec=1;

value.it_value.tv_usec=500000;

value.it_interval.tv_sec=0;

value.it_interval.tv_usec=0;

setitimer(ITIMER_REAL, &value, NULL);

 

精確定時器執行個體

本處設計了一個精確定時器的例子,進程每隔1.5秒數發送定時訊號SIGPROF,在接收到訊號時將列印定時的次數,使用者可以鍵入CTRL_C或DELETE結束程式

 

#include <sys/select.h>

#include <sys/time.h>

#include <stdio.h>

#include <unistd.h>

#include <signal.h>

int n = 0;

void timefunc(int sig)                      /* 定時事件代碼 */

{   

fprintf(stderr,"ITIMER_PROF[%d]\n", n++);

}

void main()

{   

struct itimervalvalue;   

value.it_value.tv_sec=1;                /* 定時1.5秒 */   

value.it_value.tv_usec=500000;   

value.it_interval.tv_sec=1;             /* 定時1.5秒 */    value.it_interval.tv_usec=500000;   

signal(SIGALRM,timefunc);         /* 捕獲定時訊號 */   

setitimer(ITIMER_REAL,&value, NULL);   /* 定時開始 */   

while (1);

}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.