由于最近用到了由一个信号驱动的多个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
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{
};
没那么详细,有不对的地方希望大家提出看法一起讨论 谢谢