timer_create使用问题

头文件:
       #include <signal.h>
       #include <time.h>

/* 
 * 创建定时器
 * 创建POSIX定时器,不会被传递给子进程。编译时候增加编译选项 -lrt
 * 定时器ID存储在timerid中,定时器ID在当前进程中是唯一的,除非定时器
 * 被删除。初始化的时候定时器未启动。
 * clockid定义了定时器计时的方法,有如下几个值:
 * CLOCK_REALTIME : 可设置的系统范围的实时时钟
 * CLOCK_MONOTONIC : 单调递增的时钟,系统启动后不会被改变
 * CLOCK_PROCESS_CPUTIME_ID : 用于测量当前进程(包括所有线程)CPU占用时间,包含用户调用和系统调用,
 * CLOCK_THREAD_CPUTIME_ID : 用于测量当前线程CPU占用时间,包含用户调用和系统调用
 * 参数sevp指出该如何通知调用者定时器超时信息,根据sevp.sigev_notify字段,该字段有如下值
 * SIGEV_NONE : 定时器超时后不使用异步通知,可能的情况是使用timer_gettime来监控定时器
 * SIGEV_SIGNAL : 一旦超时,产生一个信号,任何时候,至多只有一个信号会发送到队列里面,可以使用timer_getoverrun来获取超时次数
 * SIGEV_THREAD : 新建一个线程去处理,该线程执行sigev_notif_function为入口函数
 * SIGEV_THREAD_ID : linux独有,发出一个信号,和SIG_NAL类似,只不过该信号发送到指定的线程。
 * NULL : 如果sevp被设置为NULL,相当于SIGEV_SIGNAL,信号是SIGALRM
 * 返回值,成功返回0,失败返回-1并将错误码设置到errno里 
 */

Linux用户态定时器接口 timer_create,以信号处理方式使用,没有问题。如下:

  1. evp.sigev_value.sival_ptr = &timer;

  2. evp.sigev_notify = SIGEV_SIGNAL;

  3. evp.sigev_signo = SIGUSR1;

  4. signal(evp.sigev_signo, SignHandler);

  5. ret = timer_create(CLOCK_REALTIME, &evp, &timer);

  6. if(ret) {

  7. perror("timer_create");

  8. }

  9. ts.it_interval.tv_sec = 1; // the spacing time,间隔时间

  10. ts.it_interval.tv_nsec = 0;

  11. ts.it_value.tv_sec = 2; // the delay time start,倒计时时间

  12. ts.it_value.tv_nsec = 0;

  13. ret = timer_settime(timer, 0, &ts, NULL);

  14. if(ret) {

  15. perror("timer_settime");

  16. }

但是以线程接收处理会有SIGEV异常,解决办法就是先对evp进行memset 0,再进行赋值和调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值