Linux下timer的使用介绍

上传人:平*** 文档编号:15579150 上传时间:2017-11-05 格式:DOC 页数:5 大小:30.75KB
返回 下载 相关 举报
Linux下timer的使用介绍_第1页
第1页 / 共5页
Linux下timer的使用介绍_第2页
第2页 / 共5页
Linux下timer的使用介绍_第3页
第3页 / 共5页
Linux下timer的使用介绍_第4页
第4页 / 共5页
Linux下timer的使用介绍_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《Linux下timer的使用介绍》由会员分享,可在线阅读,更多相关《Linux下timer的使用介绍(5页珍藏版)》请在金锄头文库上搜索。

1、1、alarm-如果不要求很精确的话,用 alarm()和 signal()就够了unsigned int alarm(unsigned int seconds)函数说明: alarm()用来设置信号 SIGALRM 在经过参数 seconds 指定的秒数后传送给目前的进程。如果参数 seconds 为 0,则之前设置的闹钟会被取消,并将剩下的时间返回。返回值: 返回之前闹钟的剩余秒数,如果之前未设闹钟则返回 0。alarm()执行后,进程将继续执行,在后期(alarm 以后)的执行过程中将会在 seconds 秒后收到信号 SIGALRM 并执行其处理函数。#include #include

2、 #include void sigalrm_fn(int sig)printf(alarm!/n);alarm(2);return;int main(void)signal(SIGALRM, sigalrm_fn);alarm(1);while(1) pause();2、setitimer()-int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);setitimer()比 alarm 功能强大,支持 3 种类型的定时器:ITIMER_REAL : 以系统真实的时间来计算,它送出 SI

3、GALRM 信号。ITIMER_VIRTUAL: 以该进程在用户态下花费的时间来计算,它送出 SIGVTALRM信号。ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF 信号。setitimer()第一个参数 which 指定定时器类型(上面三种之一) ;第二个参数是结构itimerval 的一个实例;第三个参数可不做处理。setitimer()调用成功返回 0,否则返回-1。下面是关于 setitimer 调用的一个简单示范,在该例子中,每隔一秒发出一个SIGALRM,每隔 0.5 秒发出一个 SIGVTALRM 信号:#include #incl

4、ude #include #include #include #include int sec;void sigroutine(int signo)switch (signo)case SIGALRM:printf(Catch a signal - SIGALRM /n);signal(SIGALRM, sigroutine);break;case SIGVTALRM:printf(Catch a signal - SIGVTALRM /n);signal(SIGVTALRM, sigroutine);break;return;int main()struct itimerval value,

5、 ovalue, value2; /(1)sec = 5;printf(process id is %d/n, getpid();signal(SIGALRM, sigroutine);signal(SIGVTALRM, sigroutine);value.it_value.tv_sec = 1;value.it_value.tv_usec = 0;value.it_interval.tv_sec = 1;value.it_interval.tv_usec = 0;setitimer(ITIMER_REAL, &value, &ovalue); /(2)value2.it_value.tv_s

6、ec = 0;value2.it_value.tv_usec = 500000;value2.it_interval.tv_sec = 0;value2.it_interval.tv_usec = 500000;setitimer(ITIMER_VIRTUAL, &value2, &ovalue);for(;);(1) struct itimervalstruct itimerval structtimevalit_interval;struct timeval it_value; ;itimerval: i intervalval value itimerval 结构中的 it_value

7、是减少的时间,当这个值为 0 的时候就发出相应的信号了. 然后再将 it_value 设置为 it_interval 值.(2) setitimer()setitimer()为其所在进程设置一个定时器,如果 itimerval.it_interval 不为 0(it_interval 的两个域都不为 0),则该定时器将持续有效 (每隔一段时间就会发送一个信号 )注意:Linux 信号机制基本上是从 Unix 系统中继承过来的。早期 Unix 系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做不可靠信号 ,信号值小于 SIGRTMIN(SIGRTM

8、IN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是不可靠信号 的来源。它的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用 signal(),重新安装该信号。linux 延时函数(转载)应用层:#include 1、unsigned int sleep(unsigned int seconds); 秒级2、int usleep(useconds_t usec); 微秒级:1/10-6补:以前对于 Linux 下的延时函数只用过 Sleep,不过最近发现还有其他

9、的函数: 延时可以采用如下函数: unsigned int sleep(unsigned int seconds); sleep()会使目前程式陷入冬眠seconds 秒,除非收到不可抵的信号。 如果 sleep()没睡饱,它将会返回还需要补眠的时间,否则一般返回零。 void usleep(unsigned long usec); usleep 与 sleep()类同,不同之处在於秒的单位为 10E-6 秒。 int select(0,NULL,NULL,NULL,struct timeval *tv); 可以利用 select 的实作 sleep()的功能,它将不会等待任何事件发生。 in

10、t nanosleep(struct timespec *req,struct timespec *rem); nanosleep 会沉睡 req 所指定的时间,若 rem 为 non-null,而且没睡饱,将会把要补眠的时间放在 rem 上。#include 3、int nanosleep(const struct timespec *req, struct timespec *rem);struct timespec time_t tv_sec; long tv_nsec; ;/ The value of the nanoseconds field must be in the range

11、 0 to 999999999.#include #include void Sleep(int iSec,int iUsec)struct timeval tv;tv.tv_sec=iSec;tv.tv_usec=iUsec;select(0,NULL,NULL,NULL,&tv);iSec 为延时秒数,Usec 为延时微秒数.注:1 秒=1000 毫秒 =1000000 微秒=1000000000 纳秒=1000000000000 皮秒=1000000000000000 飞秒1s=1000ms=1000000us=1000000000ns=1000000000000ps=100000000

12、0000000fs内核层:include 1、void ndelay(unsigned long nsecs); 纳秒级:1/10-102、void udelay(unsigned long usecs); 微秒级: 1/10-63、void mdelay(unsigned long msecs); 毫秒级:1/10-3Linux 下如何实现秒以下精确定时与休眠Linux 中提供的休眠函数是 sleep 和 alarm,但是他们仅仅提供以秒为单位的休眠,这中休眠有些进程显然太长了,那么怎样才能使进程以更小的时间分辨率休眠呢?我知道的方法有 2 种,下面就做分别介绍。第一种方法是使用定时器,Li

13、nux 提供的定时器函数是:int setitimer(int which, const struct itimerval *value, structitimerval *ovalue);which 指定那种定时器。Linux 提供 3 种定时器:TIMER_REAL: 准确定时器,超时会发出 SIGALRM 信号;TIMER_VIRTUAL: 虚拟定时器,只记进程时间,所以会根据进程执行时间而变化,不能实现准确定时,超时发出 SIGVTALRM 信号;TIMER_PROF: 梗概计时器,它会根据进程时间和系统时间而变化,不能实现准确定时,超时发出 SIGPROF 信号;在进程中应该捕捉所设

14、定时器会发出的信号,因为进程收到定时器超时发出的信号后,默认动作是终止。value 是设置定时器时间,相关结构如下:struct itimerval struct timeval it_interval;struct timeval it_value; ;struct timeval long tv_sec; long tv_usec;it_interval 指定间隔时间, it_value 指定初始定时时间。如果只指定 it_value,就是实现一次定时;如果同时指定 it_interval,则超时后,系统会重新初始化 it_value 为 it_interval,实现重复定时;两者都清零,

15、则会清除定时器。tv_sec 提供秒级精度, tv_usec 提供微秒级精度,以值大的为先,注意 1s = 1000000ms。ovalue 用来保存先前的值,常设为 NULL。如果是以 setitimer 提供的定时器来休眠,只需阻塞等待定时器信号就可以了。第二种方法是使用 select 来提供精确定时和休眠:int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,struct timeval *timeout);n 指监视的文件描述符范围,通常设为所要 select 的 fd1,readfds ,writefds 和 exceptfds分别是读,写和异常文件描述符集,timeout 为超时时间。可能用到的关于文件描述符集操作的宏有:FD_CLR(int fd, fd_set *set); 清除 fdFD_ISSET(int fd, fd_set *set); 测试 fd 是否设置FD_SET(int fd, fd_set *set); 设置 fdFD_ZERO(fd

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号