linux定时器详解.doc

上传人:hw****26 文档编号:3842654 上传时间:2019-08-07 格式:DOC 页数:10 大小:69.50KB
下载 相关 举报
linux定时器详解.doc_第1页
第1页 / 共10页
linux定时器详解.doc_第2页
第2页 / 共10页
linux定时器详解.doc_第3页
第3页 / 共10页
linux定时器详解.doc_第4页
第4页 / 共10页
linux定时器详解.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、 查看文章 Linux 定时器设置(一) 2010-04-12 17:07 定时器设置 函数 alarm 设置的定时器只能精确到秒,而以下函数理论上可以精确到微妙:#include #include int getitimer(int which, struct itimerval *value);int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);函数 setitimer 可以提供三种定时器,它们相互独立,任意一个定时完成都将发送定时信号到进程,并且自动重新计时。参数 which

2、确定了定时器的类型,如表 10-6 所示:表 10-6 参数 which 与定时器类型取值 含义 信号发送 ITIMER_REAL 定时真实时间,与 alarm 类型相同。 SIGALRM ITIMER_VIRT 定时进程在用户态下的实际执行时间。SIGVTALRM ITIMER_PROF 定时进程在用户态和核心态下的实际执行时间。 SIGPROF 这三种定时器定时完成时给进程发送的信号各不相同,其中 ITIMER_REAL 类定时器发送SIGALRM 信号, ITIMER_VIRT 类定时器发送 SIGVTALRM 信号,ITIMER_REAL 类定时器发送 SIGPROF 信号。函数 al

3、arm 本质上设置的是低精确、非重载的 ITIMER_REAL 类定时器,它只能精确到秒,并且每次设置只能产生一次定时。函数 setitimer 设置的定时器则不同,它们不但可以计时到微妙(理论上) ,还能自动循环定时。在一个 Unix 进程中,不能同时使用 alarm 和 ITIMER_REAL 类定时器。结构 itimerval 描述了定时器的组成: struct itimerval struct tim. it_interval; /* 下次定时取值 */ struct tim. it_value; /* 本次定时设置值 */ 结构 tim.描述了一个精确到微妙的时间: struct t

4、im. 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

5、_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

6、_sec=2;value.it_value.tv_usec=500000;value.it_interval.tv_sec=2;value.it_interval.tv_usec=500000;setitimer(ITIMER_REAL, 函数 setitimer 设置的定时器可以重复定时,无需多次调用。例 2. 设置一个定时器,进程在用户态下执行 1 秒钟后发出首次信号,以后进程每在用户态下执行 3 秒钟,发送一个信号。答:将 itimerval 结构的成员 it_value 均赋值为 1 秒,成员 it_interval 赋值为 3 秒即可:struct itimerval value;v

7、alue.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, 例 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, 例 4. 设置一个定时

8、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, 精确定时器实例本处设计了一个精确定时器的例子,进程每隔 1.5 秒数发送定时信号 SIGPROF,在接收

9、到信号时将打印定时的次数,用户可以键入 CTRL_C 或 DELETE 结束程序,如代码 10-11 所示:代码 10-11 精确定时器实例(节自 /code/chapter10/time4.c)#include #include #include #include #include int n = 0;void timefunc(int sig) /* 定时事件代码 */ fprintf(stderr, “ITIMER_PROF%dn“, n+);void main() struct itimerval value; value.it_value.tv_sec=1; /* 定时 1.5 秒

10、*/ 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, /* 定时开始 */ while (1);编译和运行代码 10-11:# make time4 cc -O -o time4 time4.c # ./time4ITIMER_PROF0ITIMER_PROF1ITIMER_PROF2ITIMER_PRO

11、F3 #include #include #include #include #include int count = 0;void set_timer()struct itimerval itv, oldtv;itv.it_interval.tv_sec = 5;itv.it_interval.tv_usec = 0;itv.it_value.tv_sec = 5;itv.it_value.tv_usec = 0;setitimer(ITIMER_REAL, void sigalrm_handler(int sig)count+;printf(“timer signal. %dn“, cou

12、nt);int main()signal(SIGALRM, sigalrm_handler);set_timer();while (count intervalval valueitimerval 结构中的 it_value 是减少的时间,当这个值为 0 的时候就发出相应的信号了。然后再将 it_value 设置为 it_interval 值。(2) setitimer()setitimer()为其所在进程设置一个定时器,如果 itimerval.it_interval 不为0(it_interval 的两个域都不为 0),则该定时器将持续有效(每隔一段时间就会发送一个信号)注意:Linux

13、信号机制基本上是从 Unix 系统中继承过来的。早期 Unix 系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做“不可靠信号 “,信号值小于 SIGRTMIN(SIGRTMIN=32,SIGRTMAX=63 )的信号都是不可靠信号。这就是“不可靠信号“ 的来源。它的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用 signal(),重新安装该信号。定时器设置 函数 alarm 设置的定时器只能精确到秒,而以下函数理论上可以精

14、确到微妙:#include #include 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 定时真实时间,与 ala

15、rm 类型相同。 SIGALRMITIMER_VIRT 定时进程在用户态下的实际执行时间。 SIGVTALRMITIMER_PROF 定时进程在用户态和核心态下的实际执行时间。 SIGPROF这三种定时器定时完成时给进程发送的信号各不相同,其中 ITIMER_REAL 类定时器发送SIGALRM 信号,ITIMER_VIRT 类定时器发送 SIGVTALRM 信号,ITIMER_REAL 类定时器发送SIGPROF 信号。函数 alarm 本质上设置的是低精确、非重载的 ITIMER_REAL 类定时器,它只能精确到秒,并且每次设置只能产生一次定时。函数 setitimer 设置的定时器则不同

16、,它们不但可以计时到微妙(理论上),还能自动循环定时。在一个 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 设置一个定时器,参数 valu

17、e 指向一个 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 如果不为空,返回上次的定时器状态。

18、函数 getitimer 获取当前的定时器状态,整型参数 which 指定了读取的定时器类型,参数value 返回定时器状态。函数调用成功返回 0,否则返回-1。Timer values are defined by the following structures:struct itimerval struct timeval it_interval; /* next value */struct timeval it_value; /* current value */;struct timeval long tv_sec; /* seconds */long tv_usec; /* mi

19、croseconds */;#include #include #include #include #include #include void PrintMsg(int Num)printf(“%sn“, “Hello World“);return;int main(int argc, char* argv)signal(SIGALRM, PrintMsg);struct itimerval tick;tick.it_value.tv_sec = 10; /十秒钟后将启动定时器tick.it_value.tv_usec = 0;tick.it_interval.tv_sec =1; /定时器启动后,每隔 1 秒将执行相应的函数tick.it_interval.tv_usec = 0;/setitimer 将触发 SIGALRM 信号int ret = setitimer(ITIMER_REAL, if ( ret != 0)printf(“Set timer error. %s n“, strerror(errno) );return -1;printf(“Wait!n“);getchar();return 0;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。