ImageVerifierCode 换一换
格式:DOC , 页数:10 ,大小:69.50KB ,
资源ID:3842654      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3842654.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(linux定时器详解.doc)为本站会员(hw****26)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

linux定时器详解.doc

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个工作日内予以改正。