Linux教程之POSIX准时器:timer_settime() 仓酷云
系统做了些什么,这需要时间去掌握,(背命令不是一件好的学习方法,相信我你一定会在你背完之前全部忘光),尽量掌握常用命令;最壮大的准时器接口来自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不是一个无效的准时器。
尽我能力帮助他人,在帮助他人的同时你会深刻巩固知识。 学习Linux半年了~个人认为不会的多在网上找资料网上有很多资料可以搜索到,LS那位说放手去搞。 我想即使Linux高手也很难快速准确精练的回答你。 一定要学好命令,shell是命令语言,命令解释程序及程序设计语言的统称,shell也负责用户和操作系统之间的沟通。 然我们对Linux的学习首先是通过对它的产生,发展,到今天仍然在不断完善开始的。 用户下达的命令解释给系统去执行,并将系统传回的信息再次解释给用户,估shell也称为命令解释器,有关命令的学习可参考论坛相关文章,精通英文也是学习Linux的关键。 掌握硬件配置,如显卡,声卡,网卡等,硬件只要不是太老或太新一般都能被支持,作为一名Linux系统管理员建议多阅读有关硬件配置文章,对各种不支持或支持不太好的硬件有深刻的了解。 永中office 2004增强版安装只需要默认安装即可使用并操作大多与win系统雷同,打印机的配置和管理,记录光盘等。 另外Linux上也有很多的应用软件,安装运行了这些软件后,你就可以在Linux上编辑文档、图?片,玩游戏、上网、播放多媒体文件等。 Windows?是图形界面的,Linux类似以前的?DOS,是文本界面的,如果你运行了图形界面程序X-WINDOWS后,Linux?也能显示图形界面,也有开始菜单、桌面、图标等。 为什么要学Linux呢?每个人都有不同的看法,下面我说说自己的感想吧。? 我感觉linux的学习,学习编程~!~!就去学习C语言编程!!
页:
[1]