12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
| #include "Timer.h"#include #include Timer::Timer(){m_timerFd=-1;}Timer::~Timer(){ if(m_timerFd!=-1){ close(m_timerFd); m_timerFd=-1; }}int Timer::initAlarm(unsigned long long n_second, unsigned long long n_nanoseconds){ /* * 创建一个定时器对象 */ /* * timerfd_create() 函数创建一个定时器对象,同时返回一个与之关联的文件描述符。 * clockid:clockid标识指定的时钟计数器,可选值(CLOCK_REALTIME、CLOCK_MONOTONIC。。。) * CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户改成其他,则对应的时间相应改变 * CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响 * flags:参数flags(TFD_NONBLOCK(非阻塞模式)/TFD_CLOEXEC(表示当程序执行exec函数时本fd将被系统自动关闭,表示不传递) */ m_timerFd = timerfd_create(CLOCK_MONOTONIC, 0); if(m_timerFd==-1){ return -1; } /* * 设置定时器时间 */ /* * struct timespec { * time_t tv_sec; //秒 * long tv_nsec; //纳秒 * }; * * struct itimerspec { * struct timespec it_interval; //Interval for periodic timer (定时间隔周期) * struct timespec it_value; //Initial expiration (第一次超时时间) * }; */ struct itimerspec new_value; new_value.it_value.tv_sec = n_second; new_value.it_value.tv_nsec = n_nanoseconds; new_value.it_interval.tv_sec = n_second; new_value.it_interval.tv_nsec = n_nanoseconds; /* * timerfd_settime()此函数用于设置新的超时时间,并开始计时,能够启动和停止定时器; * fd: 参数fd是timerfd_create函数返回的文件句柄 * flags:参数flags为1代表设置的是绝对时间(TFD_TIMER_ABSTIME 表示绝对定时器);为0代表相对时间。 * new_value: 参数new_value指定定时器的超时时间以及超时间隔时间 * old_value: 如果old_value不为NULL, old_vlaue返回之前定时器设置的超时时间,具体参考timerfd_gettime()函数 * * ** it_interval不为0则表示是周期性定时器。 * it_value和it_interval都为0表示停止定时器 */ return timerfd_settime(m_timerFd, 0, &new_value, NULL); }int Timer::setAlarm(unsigned long long n_second, unsigned long long n_nanoseconds){ struct itimerspec new_value; new_value.it_value.tv_sec = n_second; new_value.it_value.tv_nsec = n_nanoseconds; new_value.it_interval.tv_sec = n_second; new_value.it_interval.tv_nsec = n_nanoseconds; return timerfd_settime(m_timerFd, 0, &new_value, NULL); }unsigned long long Timer::waitAlarm(){ unsigned long long tmp_exp = 0; read(m_timerFd, &tmp_exp, sizeof(tmp_exp)); return tmp_exp;}
|