青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-167  評論-8  文章-0  trackbacks-0

使用定時器的目的無非是為了周期性的執行某一任務,或者是到了一個指定時間去執行某一個任務。要達到這一目的,一般有兩個常見的比較有效的方法。一個是用linux內部的三個定時器,另一個是用sleep, usleep函數讓進程睡眠一段時間,使用alarm定時發出一個信號,還有那就是用gettimeofday, difftime等自己來計算時間間隔,然后時間到了就執行某一任務,但是這種方法效率低,所以不常用。

alarm

alarm用在不需要經確定時的時候,返回之前剩余的秒數。

NAME
       alarm - set an alarm clock for delivery of a signal
SYNOPSIS
       #include <unistd.h>
       unsigned int alarm(unsigned int seconds);
DESCRIPTION
       alarm  arranges  for a SIGALRM signal to be delivered to the process in
       seconds seconds.
       If seconds is zero, no new alarm is scheduled.
       In any event any previously set alarm is cancelled.

測試程序:

 cat timer.c
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
 
void func()
{
        printf("2 s reached.\n");
10 }
11  
12 int main()
13 {
14         signal(SIGALRM,func);
15         alarm(2);
16         while(1);
17         return 0;
18 }
19  

Linux內置的3個定時器

Linux為每個任務安排了3個內部定時器:

ITIMER_REAL:實時定時器,不管進程在何種模式下運行(甚至在進程被掛起時),它總在計數。定時到達,向進程發送SIGALRM信號。

ITIMER_VIRTUAL:這個不是實時定時器,當進程在用戶模式(即程序執行時)計算進程執行的時間。定時到達后向該進程發送SIGVTALRM信號。 

ITIMER_PROF:進程在用戶模式(即程序執行時)和核心模式(即進程調度用時)均計數。定時到達產生SIGPROF信號。ITIMER_PROF記錄的時間比ITIMER_VIRTUAL多了進程調度所花的時間。

定時器在初始化是,被賦予一個初始值,隨時間遞減,遞減至0后發出信號,同時恢復初始值。在任務中,我們可以一種或者全部三種定時器,但同一時刻同一類型的定時器只能使用一個。

 

用到的函數有:

#include <sys/time.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, struct itimerval*newvalue, struct itimerval* oldvalue);
strcut timeval
{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
struct itimerval
{
struct timeval it_interval; /*時間間隔*/
struct timeval it_value;   /*當前時間計數*/
};

it_interval用來指定每隔多長時間執行任務, it_value用來保存當前時間離執行任務還有多長時間。比如說, 你指定it_interval為2秒(微秒為0),開始的時候我們把it_value的時間也設定為2秒(微秒為0),當過了一秒, it_value就減少一個為1, 再過1秒,則it_value又減少1,變為0,這個時候發出信號(告訴用戶時間到了,可以執行任務了),并且系統自動把it_value的時間重置為it_interval的值,即2秒,再重新計數。

為了幫助你理解這個問題,我們來看一個例子:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
 
/*
*******************************************************************************************************
** Function name: main()
** Descriptions : Demo for timer.
** Input        : NONE
10 ** Output       : NONE
11 ** Created by   : Chenxibing
12 ** Created Date : 2005-12-29
13 **-----------------------------------------------------------------------------------------------------
14 ** Modified by  :
15 ** Modified Date:
16 **-----------------------------------------------------------------------------------------------------
17 *******************************************************************************************************
18 */
19 int limit = 10;
20 /* signal process */
21 void timeout_info(int signo)
22 {
23     if(limit == 0)
24     {
25         printf("Sorry, time limit reached.\n");
26         return;
27     }
28     printf("only %d senconds left.\n", limit--);
29 }
30  
31 /* init sigaction */
32 void init_sigaction(void)
33 {
34     struct sigaction act;
35  
36     act.sa_handler = timeout_info;
37     act.sa_flags   = 0;
38     sigemptyset(&act.sa_mask);
39     sigaction(SIGPROF, &act, NULL);
40 }
41  
42 /* init */
43 void init_time(void)
44 {
45     struct itimerval val;
46  
47     val.it_value.tv_sec = 1;
48     val.it_value.tv_usec = 0;
49     val.it_interval = val.it_value;
50     setitimer(ITIMER_PROF, &val, NULL);
51 }
52  
53  
54 int main(void)
55 {
56     init_sigaction();
57     init_time();
58     printf("You have only 10 seconds for thinking.\n");
59  
60     while(1);
61    return 0;
62 }
63  

對于ITIMER_VIRTUAL和ITIMER_PROF的使用方法類似,當你在setitimer里面設置的定時器為ITIMER_VIRTUAL的時候,你把sigaction里面的SIGALRM改為SIGVTALARM, 同理,ITIMER_PROF對應SIGPROF。

不過,你可能會注意到,當你用ITIMER_VIRTUAL和ITIMER_PROF的時候,你拿一個秒表,你會發現程序輸出字符串的時間間隔會不止2秒,甚至5-6秒才會輸出一個,至于為什么,自己好好琢磨一下^_^

sleep

下面我們來看看用sleep以及usleep怎么實現定時執行任務。

  1. #include <signal.h>
  2. #include <unistd.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. static char msg[] = "I received a msg.\n";
  6. int len;
  7. void show_msg(int signo)
  8. {
  9. write(STDERR_FILENO, msg, len);
  10. }
  11. int main()
  12. {
  13. struct sigaction act;
  14. union sigval tsval;
  15. act.sa_handler = show_msg;
  16. act.sa_flags = 0;
  17. sigemptyset(&act.sa_mask);
  18. sigaction(50, &act, NULL);
  19. len = strlen(msg);
  20. while ( 1 )
  21. {
  22. sleep(2); /*睡眠2秒*/
  23. /*向主進程發送信號,實際上是自己給自己發信號*/
  24. sigqueue(getpid(), 50, tsval);
  25. }
  26. return 0;
  27. }

看到了吧,這個要比上面的簡單多了,而且你用秒表測一下,時間很準,指定2秒到了就給你輸出一個字符串。所以,如果你只做一般的定時,到了時間去執行一個任務,這種方法是最簡單的。

時間差

下面我們來看看,通過自己計算時間差的方法來定時:

 

  1. #include <signal.h>
  2. #include <unistd.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <time.h>
  6. static char msg[] = "I received a msg.\n";
  7. int len;
  8. static time_t lasttime;
  9. void show_msg(int signo)
  10. {
  11. write(STDERR_FILENO, msg, len);
  12. }
  13. int main()
  14. {
  15. struct sigaction act;
  16. union sigval tsval;
  17. act.sa_handler = show_msg;
  18. act.sa_flags = 0;
  19. sigemptyset(&act.sa_mask);
  20. sigaction(50, &act, NULL);
  21. len = strlen(msg);
  22. time(&lasttime);
  23. while ( 1 )
  24. {
  25. time_t nowtime;
  26. /*獲取當前時間*/
  27. time(&nowtime);
  28. /*和上一次的時間做比較,如果大于等于2秒,則立刻發送信號*/
  29. if (nowtime - lasttime >= 2)
  30. {
  31. /*向主進程發送信號,實際上是自己給自己發信號*/
  32. sigqueue(getpid(), 50, tsval);
  33. lasttime = nowtime;
  34. }
  35. }
  36. return 0;
  37. }

這個和上面不同之處在于,是自己手工計算時間差的,如果你想更精確的計算時間差,你可以把 time 函數換成gettimeofday,這個可以精確到微妙。

上面介紹的幾種定時方法各有千秋,在計時效率上、方法上和時間的精確度上也各有不同,采用哪種方法,就看你程序的需要。

posted on 2012-01-31 09:47 老馬驛站 閱讀(9089) 評論(0)  編輯 收藏 引用 所屬分類: c++linux
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩视频永久免费| 欧美经典一区二区三区| 免费成人你懂的| 亚洲国产精品一区二区尤物区| 久久久久一区二区三区| 亚洲高清在线精品| 亚洲一区精彩视频| 国产日产欧产精品推荐色| 久久久一本精品99久久精品66| 欧美成人首页| 亚洲小视频在线观看| 国产一级揄自揄精品视频| 久久久精品动漫| 最新日韩中文字幕| 欧美一区二区三区在线观看| 国产综合色产| 欧美精品啪啪| 小嫩嫩精品导航| 亚洲国产高清高潮精品美女| 一区二区三区日韩在线观看| 国产午夜精品福利| 欧美日本三级| 久久成人综合网| 日韩一区二区精品在线观看| 久久久精品国产99久久精品芒果| 最近看过的日韩成人| 国产精品一二| 欧美激情一区二区三区成人| 午夜精品一区二区三区在线视 | 午夜国产精品视频| 亚洲高清在线播放| 久久精品91久久久久久再现| 亚洲精品欧美| 韩国三级电影一区二区| 欧美日韩中文字幕在线| 久久先锋影音av| 亚洲小说欧美另类社区| 亚洲国产成人精品久久| 久久久精品午夜少妇| 亚洲在线免费视频| 亚洲精品永久免费| 好吊妞这里只有精品| 国产精品久久一区主播| 欧美极品影院| 蜜桃久久精品乱码一区二区| 午夜视频久久久久久| 9色精品在线| 亚洲国产一区二区三区高清 | 久久婷婷成人综合色| 亚洲特黄一级片| 亚洲人妖在线| 在线欧美视频| 黑人操亚洲美女惩罚| 国产情人综合久久777777| 欧美日韩和欧美的一区二区| 久久天堂成人| 久久亚洲一区| 久久久夜精品| 久久精品亚洲| 久久国产主播| 欧美一区二区高清| 性欧美xxxx大乳国产app| 亚洲一区一卡| 亚洲性xxxx| 亚洲一区二区三区乱码aⅴ| 99re热精品| 日韩亚洲精品在线| 亚洲美女黄色| 一本色道综合亚洲| aa级大片欧美| 亚洲午夜羞羞片| 亚洲无线观看| 先锋影院在线亚洲| 欧美一级久久久久久久大片| 欧美一区2区视频在线观看| 欧美亚洲网站| 久久久久久午夜| 蜜桃久久精品乱码一区二区| 欧美成人黄色小视频| 欧美黄色aa电影| 欧美精品日韩| 国产精品白丝jk黑袜喷水| 国产精品久久久久9999吃药| 国产日产亚洲精品| 一区二区三区我不卡| 亚洲人成网站在线播| 在线视频精品| 性伦欧美刺激片在线观看| 久久九九精品| 欧美国产欧美亚洲国产日韩mv天天看完整 | 伊人久久噜噜噜躁狠狠躁| 在线日韩欧美视频| 99精品国产一区二区青青牛奶| 亚洲最新在线视频| 性色av一区二区三区红粉影视| 久久精品国产免费观看| 欧美福利视频在线观看| 亚洲精品国精品久久99热一| 国产精品99久久久久久有的能看| 午夜精品久久久久久| 老牛嫩草一区二区三区日本| 欧美日韩高清在线| 国产欧美日韩在线观看| 91久久在线| 午夜精品在线观看| 欧美高清视频在线播放| 亚洲最新在线视频| 久久精品av麻豆的观看方式| 欧美成人一区二区三区片免费| 国产精品久久久久久久浪潮网站| 狠狠色狠狠色综合| 制服诱惑一区二区| 麻豆国产精品777777在线| 亚洲美女一区| 久久久免费精品视频| 欧美日韩综合不卡| 亚洲高清网站| 欧美中文在线观看| 亚洲人成网在线播放| 欧美亚洲自偷自偷| 欧美日韩视频一区二区三区| 国内精品久久久久久久影视蜜臀 | 亚洲精品久久久久| 欧美一区二区三区四区在线 | 欧美在线视频导航| 91久久黄色| 久久精品夜夜夜夜久久| 国产精品国产三级国产a| 亚洲第一免费播放区| 西西裸体人体做爰大胆久久久| 欧美国产精品va在线观看| 午夜视频久久久| 欧美午夜视频在线| 亚洲麻豆av| 欧美成人免费全部观看天天性色| 午夜精品久久久久久久99黑人| 欧美另类99xxxxx| 亚洲电影在线看| 久久久久99| 亚洲欧美一区二区三区久久| 欧美性猛片xxxx免费看久爱| 亚洲精品永久免费精品| 欧美成人国产一区二区| 久久久亚洲成人| 国产三级欧美三级日产三级99| 亚洲午夜一级| 亚洲人成在线观看一区二区| 麻豆精品91| 一区二区在线看| 久久久人成影片一区二区三区| 亚洲午夜一区二区三区| 国产精品xxx在线观看www| 亚洲视屏在线播放| 亚洲伦理在线| 欧美日本一区二区三区| 日韩视频中文| 亚洲清纯自拍| 欧美日韩的一区二区| av不卡在线| 亚洲乱码国产乱码精品精天堂| 欧美激情一区二区三区不卡| 91久久久亚洲精品| 亚洲第一精品夜夜躁人人躁| 牛夜精品久久久久久久99黑人| 亚洲欧洲精品一区二区三区波多野1战4 | 久久综合综合久久综合| 亚洲国产日日夜夜| 欧美顶级少妇做爰| 欧美不卡视频一区发布| 日韩视频一区二区在线观看| 91久久久久久久久| 欧美午夜精品理论片a级按摩| 中文一区二区| 亚洲欧美激情在线视频| 国产在线国偷精品产拍免费yy| 久久久另类综合| 久久男女视频| 亚洲美女黄色片| 艳妇臀荡乳欲伦亚洲一区| 国产精品色网| 玖玖国产精品视频| 欧美大片免费| 午夜精品久久久久久99热| 午夜精品美女久久久久av福利| 狠久久av成人天堂| 亚洲二区精品| 国产精品v片在线观看不卡| 亚洲欧美电影在线观看| 欧美一区二区精品在线| 亚洲国产三级| 一区二区三区波多野结衣在线观看| 国产精品一区二区三区四区五区| 久久久久久成人| 欧美成人精品h版在线观看| 亚洲一区999| 久久精品一区二区国产| 日韩午夜在线电影| 亚洲欧美日韩国产综合| 91久久精品国产91性色| 亚洲一区二区免费视频|