说下C中的定时

因为项目的需要,最近研究实时性很多,包括实时操作系统,香港服务器,线程优先级调度等等,其中一个很重要的地方就是定时器的研究。以下说的环境都在Linux下。

首先说下Linux下的一般较精确的定时吧,setitimer函数,

1 #include <sys/time.h>2 int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);

which参数指定了选用的时钟类型,与时钟类型对应的也决定了时钟产生的信号,可以使用的时钟类型如下:

ITIMER_REAL

定时真实时间,香港服务器,与alarm类型相同。

SIGALRM

ITIMER_VIRT

定时进程在用户态下的实际执行时间。

SIGVTALRM

ITIMER_PROF

定时进程在用户态和核心态下的实际执行时间。

SIGPROF

value参数指定了定时的时间,开始时间和间隔时间。ovalue参数如果不为空的话返回前一次的时钟状态,一般为null.

struct itimerval的结构:

struct itimerval{tim. it_value;}

struct tim的结构:

struct tim.{tv_usec;}

这就是一般定时器的主要函数了。当然与另外一个函数必不可分

signal(int,void (*handle)(int sig))

。好了,我们再看看Linux下另一个更加精确的定时函数。

posix为了统一Linux定义了一系列的标准,其中就有一个关于时钟的标准,现在的Linux一般都参照了这个标准,都能提供比较精确的定时了。

POSIX中产生定时的函数为:

timer_create(clock_id,evp,timerid)

clock_id和上面的一样表明基于的是哪个时钟,一般取值取下:

CLOCK_REALTIME:Systemwiderealtimeclock.

CLOCK_MONOTONIC:Representsmonotonictime.Cannotbeset.

CLOCK_PROCESS_CPUTIME_ID:Highresolutionper-processtimer.

CLOCK_THREAD_CPUTIME_ID:Thread-specifictimer.

CLOCK_REALTIME_HR:HighresolutionversionofCLOCK_REALTIME.

CLOCK_MONOTONIC_HR:HighresolutionversionofCLOCK_MONOTONIC.

,timerid返回的是产生的时钟的一个编号的东东,evp是关于产生什么信号或者指令的一个sigevent的结构,他指明了产生的信号。

struct sigevent{  int sigev_notify; //产生信号还是指令    int sigev_signo; //产生的信号名  union sigval sigev_value; //信号的具体信息  void (*sigev_notify_function)(union sigval);  pthread_attr_t *sigev_notify_attributes;}

一般设置sigev_notify=SIGEV_SIGNAL,产生的信号可以自己设为合法的信号。

如果函数调用成功则返回0,否则非0.。。

上面的函数是产生一个时钟,但是这个时钟只指明了产生的信号,还有时间需要指定,这时需要另外一个函数:

timer_settime(timerid, flags, value, ovalue)

flags的用处很多,但是flags一般设置为null,如果有必要可以去参考posix IEEE2003.1b。value是指明定时机制的问题,香港服务器租用,可以精确到ns,但实际不可能啦。。ovlaue和setitimer一样如果不为空返回上一次的时间结构。

value是一个itimerspec的结构体。

struct itimerspec{struct timespec it_interval;struct timespec it_value;}

timespec的结构如下:

struct spec{__time_t tv_sec;long int tv_nsec; //设置ns定时}

这样一个基本的定时的主要函数都介绍完了。

例子就由自己去组合吧。。查阅资料也是学习。

每一发奋努力的背后,必有加倍的赏赐。

说下C中的定时

相关文章:

你感兴趣的文章:

标签云: