1. setitimer方法
nginx 实现, 在这段代码中,定义了itimerval的数据结构,并设置这个数据结构的值,从而定时器的间隔时间,settimer的函数第一个参数表示经过timer就会触发sigalarm事件, 然后注册了信号sigalarm的事件,从而触发定时器
signal(SIGALRM, printMsg);
void printMsg(int num) {
printf("%s","Hello World!!\n");
}
struct itimerval itv;
itv.it_interval.tv_sec = ngx_timer_resolution / 1000;
itv.it_interval.tv_usec = (ngx_timer_resolution % 1000) * 1000
itv.it_value.tv_sec = ngx_timer_resolution / 1000;
itv.it_value.tv_usec = (ngx_timer_resolution % 1000 ) * 1000;
if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"setitimer() failed");
}
2. pthread_mutex_timedlock
在dtc的agent实现中,先创建一个线程,然后在线程中用如下的函数来阻塞,从而达到定时器的目的。pthread_mutex_timedlock指的是阻塞愿意等待的时间ts
pthread_mutex_trylock(&wakeLock)
while(pthread_mutex_timedlock(&wakeLock, &ts) != 0)
{
//DoSth
}
3. epoll_wait实现
可以设置epoll_wait的timeout从而达到定时器,epoll等待timeout秒之后就执行后面的程序
int epoll_wait(int efd, struct epoll_event *event, int maxeevents, int timeout)
//efd 由epoll_create创建的fd
//timeout 为一次监听的间隔
//当有事件触发 返回int 表示事件个数,event里存储的是触发的事件
模拟定时器写的一个代码
#include<stdio.h>
#include<sys/epoll.h>
#include <sys/time.h>
#include<time.h>
#include<signal.h>
#include <stdlib.h>
#include <unistd.h>
#define MAX_EVENTS 100
void printMsg(int num) {
time_t t = time(NULL);
struct tm *tt = localtime(&t);
printf("%d,%d,%d\n", tt->tm_hour, tt->tm_min , tt->tm_sec);
printf("%s","Hello World!!\n");
}
int main()
{
struct epoll_event events[MAX_EVENTS];
int ep;
int nfds;
while(0==0)
{
ep = epoll_create(100);
signal(SIGALRM, printMsg);
struct itimerval itv;
itv.it_interval.tv_sec = 10 ;
itv.it_interval.tv_usec = 0 ;
//itv.it_interval.tv_usec = (ngx_timer_resolution % 1000) * 1000;
itv.it_value.tv_sec = 10;
itv.it_value.tv_usec = 10;
//itv.it_value.tv_usec = (ngx_timer_resolution % 1000 ) * 1000;
setitimer(ITIMER_REAL, &itv, NULL);
nfds = epoll_wait(ep, events, MAX_EVENTS, -1);
printf("%d events occur\n", nfds);
}
}