最强大的定时器接口来自POSIX时钟系列,你知道吗?
最强悍的定时器插口来自POSIX时钟系列,其创建、初始化以及删掉一个定时器的行动被分为三个不同的函数:timer_create()(创建定时器)、timer_settime()(初始化定时器)以及timer_delete(销毁它)。
创建一个定时器:
<span style="font-family:SimSun;font-size:18px;color:#ff0000">int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid)</span>
进程可以通过调用timer_create()创建特定的定时器,定时器是每位进程自己的,不是在fork时承继的。clock_id说明定时器是基于那个时钟的,*timerid装载的是被创建的定时器的ID。该函数创建了定时器,并将他的ID装入timerid指向的位置中。参数evp指定了定时器到期要形成的异步通知。假如evp为NULL,这么定时器到期会形成默认的讯号,对CLOCK_REALTIMER来说,默认讯号就是SIGALRM。假如要形成除默认讯号之外的其它讯号linux,程序必须将evp->sigev_signo设置为期望的信号码。structsigevent结构中的成员evp->sigev_notify说明了定时器到期时应当采取的行动。一般,这个成员的值为SIGEV_SIGNAL,这个值说明在定时器到期时,会形成一个讯号。程序可以将成员evp->sigev_notify设为SIGEV_NONE来避免定时器到期时形成讯号。
假如几个定时器形成了同一个讯号,处理程序可以用evp->sigev_value来分辨是那个定时器形成了讯号。要实现这些功能,程序必须在为讯号安装处理程序时,使用structsigaction的成员sa_flags中的标志符SA_SIGINFO。
clock_id取值为以下:
struct sigevent { <span> </span>int sigev_notify; //notification type <span> </span>int sigev_signo; //signal number <span> </span>union sigval sigev_value; //signal value <span> </span>void (*sigev_notify_function)(union sigval); <span> </span>pthread_attr_t *sigev_notify_attributes; } union sigval { <span> </span>int sival_int; //integer value <span> </span>void *sival_ptr; //pointer value }
通过将evp->sigev_notify设定为如下值来定制定时器到期后的行为:
启动一个定时器:
timer_create()所创建的定时器并未启动。要将它关联到一个到期时间以及启动时钟周期,可以使用timer_settime()。
<span style="font-family:SimSun;font-size:18px;color:#ff0000">int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspect *ovalue);</span>
struct itimespec { struct timespec it_interval; struct timespec it_value; };
就像settimer(),it_value用于指定当前的定时器到期时间。当定时器到期,it_value的值会被更新成it_interval的值。假如it_interval的值为0,则定时器不是一个时间间隔定时器,一旦it_value到期都会回到未启动状态。timespec的结构提供了毫秒级码率:
struct timespec { time_t tv_sec; long tv_nsec; };
假如flags的值为TIMER_ABSTIME,则value所指定的时间值会被剖析成绝对值(此值的默认的剖析方法为相对于当前的时间)。这个经更改的行为可防止取得当前时间、计算“该时间”与“所期望的未来时间”的相对差额以及启动定时器期间导致竞争条件。
假如ovalue的值不是NULL,则之前的定时器到期时间会被存入其所提供的itimerspec。假如定时器之前处在未启动状态arm linux,则此结构的成员全就会被设定成0。
获得一个活动定时器的剩余时间:
<span style="font-family:SimSun;font-size:18px;color:#ff0000">int timer_gettime(timer_t timerid,struct itimerspec *value);</span>
取得一个定时器的超限运行次数:
有可能一个定时器到期了,而同一定时器上一次到期时形成的讯号还处于挂起状态。在这些情况下,其中的一个讯号可能会遗失。这就是定时器超限。程序可以通过调用timer_getoverrun来确定一个特定的定时器出现这些超限的次数。定时器超限只能发生在同一个定时器形成的讯号上。由多个定时器linux 定时器程序,甚至是这些使用相同的时钟和讯号的定时器,所形成的讯号就会排队而不会遗失。
<span style="font-family:SimSun;font-size:18px;color:#ff0000">int timer_delete (timer_t timerid);</span>
执行成功时,timer_getoverrun()会返回定时器初次到期与通知进程(比如通过讯号)定时器已到期之间额外发生的定时器到期次数。举例来说linux 定时器程序,在我们之前的事例中,一个1ms的定时器运行了10ms,则此调用会返回9。假如超限运行的次数等于或小于DELAYTIMER_MAX,则此调用会返回DELAYTIMER_MAX。
执行失败时,此函数会返回-1并将errno设定会EINVAL,这个惟一的错误情况代表timerid指定了无效的定时器。
删掉一个定时器:
<span style="font-family:SimSun;font-size:18px;color:#ff0000">int timer_delete (timer_t timerid);</span>
一次成功的timer_delete()调用会销毁关联到timerid的定时器而且返回0。执行失败时,此调用会返回-1并将errno设定会EINVAL,这个惟一的错误情况代表timerid不是一个有效的定时器。
例1:
voidhandle()
time_tt;
charp[32];
time(&t);
strftime(p,sizeof(p),"%T",localtime(&t));
printf("timeis%s/n",p);
intmain()
structsigeventevp;
structitimerspects;
timer_ttimer;
intret;
evp.sigev_value.sival_ptr=&timer;
evp.sigev_notify=SIGEV_SIGNAL;
evp.sigev_signo=SIGUSR1;
signal(SIGUSR1,handle);
ret=timer_create(CLOCK_REALTIME,&evp,&timer);
if(ret)
perror("timer_create");
_sec=1;
_nsec=0;
_sec=3;
_nsec=0;
ret=timer_settime(timer,0,&ts,NULL);
如果(转)
perror("timer_settime");
同时(1);
例2:
voidhandle(unionsigvalv)
time_tt;
charp[32];
时间(&t);
strftime(p,sizeof(p),"%T",localtime(&t));
printf("%sthread%lu,val=%d,signalcaptured./n",p,pthread_self(),v.sival_int);
返回;
intmain()
structsigeventevp;
结构透视;
timer_timmer;
内心;
memset(&evp,0,sizeof(evp));
evp.sigev_value.sival_ptr=&timer;
evp.sigev_notify=SIGEV_THREAD;
evp.sigev_notify_function=handle;
evp.sigev_value.sival_int=3;//作为handle()的参数
ret=timer_create(CLOCK_REALTIME,&evp,&timer);
如果(重)
perror("timer_create");
_sec=1;
_nsec=0;
_秒=3;
_nsec=0;
ret=timer_settime(timer,TIMER_ABSTIME,&ts,NULL);
如果(转)
perror("timer_settime");
同时(1);
以上是最强大的定时器接口来自POSIX时钟系列,你知道吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

您可以在 iPhone 相机上设置多长时间的定时器?当您在 iPhone 的相机应用程序中访问定时器选项时,您将获得在两种模式之间进行选择的选项:3 秒 (3s)和10 秒 (10s)。当您手持 iPhone 时,您可以使用第一个选项从前置或后置摄像头快速自拍。第二个选项在场景中很有用,可以在远处将 iPhone 安装到三脚架上来点击合影或自拍。 如何在 iPhone 相机上设置定时器 虽然在 iPhone 相机上设置定时器是一个相当简单的过程,但具体操作方式因所使用的 iPhone 机型而异。

PHP的POSIX扩展是一组允许PHP与POSIX兼容操作系统进行交互的函数和常量。POSIX(PortableOperatingSystemInterface)是一组操作系统接口标准,旨在允许软件开发人员编写可在各种UNIX或UNIX类操作系统上运行的应用程序。本文将介绍如何使用PHP的POSIX扩展,包括安装和使用。一、安装PHP的POSIX扩展在

如何实现Workerman文档中的定时器功能Workerman是一款强大的PHP异步网络通信框架,它提供了丰富的功能,其中就包括定时器功能。使用定时器可以在指定的时间间隔内执行代码,非常适合定时任务、轮询等应用场景。接下来,我将详细介绍如何在Workerman中实现定时器功能,并提供具体的代码示例。第一步:安装Workerman首先,我们需要安装Worker

定时器的表达式用于定义任务的执行计划。定时器的表达式是基于“在给定的时间间隔之后执行任务”的模型。表达式通常由两个部分组成:一个初始延迟和一个时间间隔。

Java定时器:如何设置每天定时执行任务?在日常的Java开发中,我们经常会遇到需要每天定时执行某个任务的需求。比如说每天凌晨1点执行数据备份任务,或者每天晚上8点发送日报邮件等等。那么在Java中,我们可以使用定时器来实现这样的功能。Java提供了多种定时器的实现方式,本文将介绍基于Timer和ScheduledExecutorService两种方式来设置

定时器的工作原理可以分为硬件定时器和软件定时器两种类型。硬件定时器的工作原理是时钟信号源提供稳定的时钟信号作为计时器的基准。计数器从预设值开始计数,每当时钟信号到达时计数器递增。当计数器达到预设值时,定时器会触发一个中断信号通知中断控制器处理相应的中断服务程序。在中断服务程序中,可以执行一些预定的操作。软件定时器的工作原理是通过编程语言或系统提供的库函数或系统调用来实现的等等。

2015 年 4 月 20 日,Redox OS 作为一种新的微内核操作系统出现,“注重安全、自由、可靠、正确和实用”。该项目用 Rust 和汇编语言编写,受到以下代码片段的启发

Java定时器:如何设置每月定时执行任务?引言:在开发中,经常会遇到需要每月定时执行任务的场景,例如每月更新统计数据、定期发送报表等。Java提供了多种定时器实现方式,本文将介绍如何使用Java定时器来实现每月定时执行任务,并提供具体的代码示例。一、使用Timer类实现每月定时执行任务Timer类是Java提供的最基础的定时器类,通过它可以实现简单的定时任务
