程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 精確定時器設置(《精通Unix下C語言編程與項目實踐》之六)

精確定時器設置(《精通Unix下C語言編程與項目實踐》之六)

編輯:關於C語言

文章試讀 不拘一個遍程序系列編程序不能一個腦袋鑽到底,有時要學會變通,即所謂的曲線救國。 職場規劃:一些雜七雜八的職場感悟吧。不值錢的軟件人才 精力充沛與事業成功   讓系分來得更猛烈些吧    不值錢的系統分析師  我的詩歌:都是我的打油詩,但是很值得一讀。不要工作還衣食無憂之四難歌   香格裡拉美人圖 寶寶圖片:超可愛的小寶寶 博客 考試培訓:主要是關於考研、軟考和等級的相關題解。2009考研試題分析   2008年12月程序員試題分析    2009年軟考備考全攻略    2008年5月程序員試題解析       《精通Unix下C語言編程與項目實踐》之六 精確定時器設置  作者:朱雲翔,胡平  

10.5.2 精通定時器設置

函數alarm設置的定時器只能精確到秒,而以下函數理論上可以精確到微妙: #include  <sys/select.h> #include  <sys/itimer.h> int getitimer(int which, struct itimerval *value); int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue); 函數setitimer可以提供三種定時器,它們相互獨立,任意一個定時完成都將發送定時信號到進程,並且自動重新計時。參數which確定了定時器的類型,如表10-6所示: 表10-6 參數which與定時器類型 取值 含義 信號發送 ITIMER_REAL 定時真實時間,與alarm類型相同。 SIGALRM ITIMER_VIRT 定時進程在用戶態下的實際執行時間。 SIGVTALRM ITIMER_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秒即可: struct itimerval 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結束程序,如代碼10-11所示: 代碼10-11 精確定時器實例節自/code/chapter10/time4.c) #include  <sys/select.h> #include  <sys/itimer.h> #include <stdio.h> #include <unistd.h> #include <signal.h> int n = 0; void timefunc(int sig)                      /* 定時事件代碼 */ {     fprintf(stderr, "ITIMER_PROF[%d]\n", n++);     signal(SIGPROF, timefunc);              /* 捕獲定時信號 */ } void main() {     struct itimerval value;     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(SIGPROF, timefunc);          /* 捕獲定時信號 */     setitimer(ITIMER_PROF, &value, NULL);   /* 定時開始 */     while (1); } 編譯和運行代碼10-11: # make time4         cc -O -o time4 time4.c # ./time4 ITIMER_PROF[0] ITIMER_PROF[1] ITIMER_PROF[2] ITIMER_PROF[3]      相關文章: 封面          前言        目錄         策劃         作者 動態庫        變長參數    文件鎖       外設         僵死進程 定時器   

本文出自 “編程浪子朱雲翔” 博客,請務必保留此出處http://zhuyunxiang.blog.51cto.com/653596/133995

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved