POSIX定时器

代码(1s定时以创建线程的方式运行回调函数)

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <error.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
#include <pthread.h>

void handle(union sigval v)
{
 time_t t;
 char p[32];

 time(&t);
 strftime(p, sizeof(p), "%T", localtime(&t));

 printf("%s thread %lu, val = %d, signal captured.\n", p, pthread_self(), v.sival_int);
 return;
}

 

int main()
{
 struct sigevent evp;
 struct itimerspec ts;
 timer_t timer;
 int ret;

 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);
 if( ret)
  perror("timer_create");

 ts.it_interval.tv_sec = 1;
 ts.it_interval.tv_nsec = 0;
 ts.it_value.tv_sec = 3;
 ts.it_value.tv_nsec = 0;

 ret = timer_settime(timer, TIMER_ABSTIME, &ts, NULL);
 if( ret )
  perror("timer_settime");

 while(1);
}

代码(1s定时发送信号,并执行指定的函数)


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <error.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
#include <pthread.h>

void handle(union sigval v)
{
 time_t t;
 char p[32];

 time(&t);
 strftime(p, sizeof(p), "%T", localtime(&t));

 printf("%s thread %lu, val = %d, signal captured.\n", p, pthread_self(), v.sival_int);
 return;
}

 

int main()
{
 struct sigevent evp;
 struct itimerspec ts;
 timer_t timer;
 int ret;

 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);
 if( ret)
  perror("timer_create");

 ts.it_interval.tv_sec = 1;
 ts.it_interval.tv_nsec = 0;
 ts.it_value.tv_sec = 3;
 ts.it_value.tv_nsec = 0;

 ret = timer_settime(timer, TIMER_ABSTIME, &ts, NULL);
 if( ret )
  perror("timer_settime");

 while(1);
}

编译指令

需连接librt.a库。

gcc xxx.c -o xxx -lrt

==============================================================================

相关说明

定时器接口来自POSIX时钟系列,其创建、初始化以及删除一个定时器的行动被分为三个不同的函数:timer_create()(创建定时器)、timer_settime()(初始化定时器)以及timer_delete(销毁定时器)。

注:
1.系统中如果一个模块需要频繁的获取系统时间,使用linux中内置的函数开销过大。
2.SIGALRM的中断信号回终止sleep,因为sleep就是用SIGALRM信号量实现的。

相关函数详解

==============================================================================

1.timer_create

//创建一个定时器
int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid)

…未完待续

==============================================================================

2.timer_settime

//设置定时时间并启动定时器
int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspect *ovalue);

…未完待续

==============================================================================

3.timer_gettime

//获得一个活动定时器的剩余时间:
int timer_gettime(timer_t timerid,struct itimerspec *value);

…未完待续

==============================================================================

4.timer_getoverrun

///获得一个定时器的超限运行次数:
int timer_getoverrun(timer_t timerid);

…未完待续

==============================================================================

5.timer_delete

删除一个定时器:
int timer_delete (timer_t timerid);

…未完待续

转载自
POSIX定时器:timer_settime()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值