|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
系统做了些什么,这需要时间去掌握,(背命令不是一件好的学习方法,相信我你一定会在你背完之前全部忘光),尽量掌握常用命令;
最壮大的准时器接口来自POSIX时钟系列,其创立、初始化和删除一个准时器的举动被分为三个分歧的函数:timer_create()(创立准时器)、timer_settime()(初始化准时器)和timer_delete(烧毁它)。
创立一个准时器
inttimer_create(clockid_tclock_id,structsigevent*evp,timer_t*timerid)
历程能够经由过程挪用timer_create()创立特定的准时器,准时器是每一个历程本人的,不是在fork时承继的。clock_id申明准时器是基于哪一个时钟的,*timerid装载的是被创立的准时器的ID。该函数创立了准时器,并将他的ID放进timerid指向的地位中。参数evp指定了准时器到期要发生的异步关照。假如evp为NULL,那末准时器到期会发生默许的旌旗灯号,对CLOCK_REALTIMER来讲,默许旌旗灯号就是SIGALRM。假如要发生除默许旌旗灯号以外的别的旌旗灯号,程序必需将evp->sigev_signo设置为希冀的旌旗灯号码。structsigevent布局中的成员evp->sigev_notify申明了准时器到期时应当接纳的举动。一般,这个成员的值为SIGEV_SIGNAL,这个值申明在准时器到期时,会发生一个旌旗灯号。程序能够将成员evp->sigev_notify设为SIGEV_NONE来避免准时器到期时发生旌旗灯号。
假如几个准时器发生了统一个旌旗灯号,处置程序能够用evp->sigev_value来辨别是哪一个准时器发生了旌旗灯号。要完成这类功效,程序必需在为旌旗灯号安装处置程序时,利用structsigaction的成员sa_flags中的标记符SA_SIGINFO。
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.
- structsigevent{intsigev_notify;//notificationtypeintsigev_signo;//signalnumberunionsigvalsigev_value;//signalvaluevoid(*sigev_notify_function)(unionsigval);pthread_attr_t*sigev_notify_attributes;}unionsigval{intsival_int;//integervaluevoid*sival_ptr;//pointervalue}
复制代码 经由过程将evp->sigev_notify设定为以下值来定制订时器到期后的举动:
SIGEV_NONE:甚么都不做,只供应经由过程timer_gettime和timer_getoverrun查询超时信息。
SIGEV_SIGNAL:当准时器到期,内核会将sigev_signo所指定的旌旗灯号传送给历程。在旌旗灯号处置程序中,si_value会被设定会sigev_value。
SIGEV_THREAD:当准时器到期,内核会(在此历程内)以sigev_notification_attributes为线程属性创立一个线程,而且让它实行sigev_notify_function,传进sigev_value作为为一个参数。
启动一个准时器
timer_create()所创立的准时器并未启动。要将它联系关系到一个到期工夫和启动时钟周期,可使用timer_settime()。- inttimer_settime(timer_ttimerid,intflags,conststructitimerspec*value,structitimerspect*ovalue);structitimespec{structtimespecit_interval;structtimespecit_value;};
复制代码 好像settimer(),it_value用于指定以后的准时器到期工夫。当准时器到期,it_value的值会被更新成it_interval的值。假如it_interval的值为0,则准时器不是一个工夫距离准时器,一旦it_value到期就会回到未启动形态。timespec的布局供应了纳秒级分辩率:- structtimespec{time_ttv_sec;longtv_nsec;};
复制代码 假如flags的值为TIMER_ABSTIME,则value所指定的工夫值会被解读成相对值(此值的默许的解读体例为相对以后的工夫)。这个经修正的举动可制止获得以后工夫、盘算“该工夫”与“所希冀的将来工夫”的绝对差额和启动准时器时代形成合作前提。
假如ovalue的值不是NULL,则之前的准时器到期工夫会被存进其所供应的itimerspec。假如准时器之前处在未启动形态,则此布局的成员全城市被设定成0。
取得一个举动准时器的残剩工夫- inttimer_gettime(timer_ttimerid,structitimerspec*value);
复制代码 获得一个准时器的超限运转次数
有大概一个准时器到期了,而统一准时器上一次到期时发生的旌旗灯号还处于挂起形态。在这类情形下,个中的一个旌旗灯号大概会丧失。这就是准时器超限。程序能够经由过程挪用timer_getoverrun来断定一个特定的准时器呈现这类超限的次数。准时器超限只能产生在统一个准时器发生的旌旗灯号上。由多个准时器,乃至是那些利用不异的时钟和旌旗灯号的准时器,所发生的旌旗灯号城市列队而不会丧失。- inttimer_getoverrun(timer_ttimerid);
复制代码 实行乐成时,timer_getoverrun()会前往准时器初度到期与关照历程(比方经由过程旌旗灯号)准时器已到期之间分外产生的准时器到期次数。举例来讲,在我们之前的例子中,一个1ms的准时器运转了10ms,则此挪用会前往9。假如超限运转的次数即是或年夜于DELAYTIMER_MAX,则此挪用会前往DELAYTIMER_MAX。
实行失利时,此函数会前往-1并将errno设定会EINVAL,这个独一的毛病情形代表timerid指定了有效的准时器。
删除一个准时器- inttimer_delete(timer_ttimerid);
复制代码 一次乐成的timer_delete()挪用会烧毁联系关系到timerid的准时器而且前往0。实行失利时,此挪用会前往-1并将errno设定会EINVAL,这个独一的毛病情形代表timerid不是一个无效的准时器。
尽我能力帮助他人,在帮助他人的同时你会深刻巩固知识。 |
|