POSIX定时器用法

由于最近用到了由一个信号驱动的多个posix定时器,就仔细研究了一下,然后跟大家分享一下(linux):

首先是定时器的初始化:

timer_create(clock_t clock_id,  struct sigevent *evp, timer_t *timerid);

       第一个参数 clock_id是定时器基于的时钟,我用到的是实时时钟 CLOCK_REALTIME, 他的取值有很多种, 常用的应该就是实时时钟了;

       第二个参数 evp 是设置定时器的参数,包括信号驱动或者是线程机制实现;

       第三个参数 timerid 是定时器ID,由函数返回;


evp的设置:

struct sigevent

{

          int sigev_notify;   //通过这个参数来指定定时器到期后的行为

          int sigev_signo;   //设置的期望的信号码

          union sigval   sigev_value;   //这个参数是准备传入线程函数或者信号处理函数的值

          void (*sigev_notify_function)(union  sigval);  //线程函数

          pthread_attr_t*sigev_notify_attributes; //线程属性

}


/* 下面的联合体就存放着准备传入的值 可以是int 或 void*  */

union sigval

{

         int sival_int;

         void *sival_ptr;

}

单独说一下sigev_notify, 它的设置有三种: 

        SIGEV_NONE     :到期后什么也不做

        SIGEV_SIGNAL  :到期后产生信号,如果是信号的方式,则保存在sigval中的值会传给信号处理函数中的siginfo_t结构体的si_value中,

                                           si_value也是一联合体,与sigval相同此时sigaction中flag的设置必须是SA_SIGINFO, 此时信号到期后就会

                                           执行   void     (*sa_sigaction)(int, siginfo_t *, void *);

      SIGEV_THREAD :到期后启动一个线程去处理


int sigaction(int signum,    const struct sigaction *act,     struct sigaction *oldact);

struct sigaction 的设置如下:

struct sigaction {
          void (*sa_handler)(int);                                    //同signal
          void (*sa_sigaction)(int, siginfo_t *, void *);  //sa_flags 设置SA_SIGINFO  执行此函数
          sigset_t sa_mask;                                              // 信号屏蔽
          int sa_flags;                                                         // SA_SIGINFO
          void (*sa_restorer)(void);                                  //此参数没有意义
};


void (*sa_sigaction)(int, siginfo_t *, void *)中siginfo_t结构体中 sigval_t  si_value 就是用来区分不同的定时器的ID,确定信号的产生来源于那个定时器

typedef union sigval

{

           int sival_int;

          void *sival_ptr;

} sigval_t;                   


定时器的启动:

int timer_settime(timer_ttimerid,int flags,const struct itimerspec *value,struct itimerspec*ovalue);

struct   itimerspec   

  
                 struct    timespec   it_interval;//定时器周期值
                 struct    timespec  it_value;    //定时器到期值
};   

gcc  *.c  -lrt 去编译


没那么详细,有不对的地方希望大家提出看法一起讨论 谢谢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值