时间函数和定时线程(linux C )
2014-02-24 19:32
609 查看
1.日期时间输出格式:
printf("%04d-%02d-%02d\n",year,month,day);
输出:1994-02-07 d表示输出整数、2表示宽度、0表示不足两位前面补0,右对齐。
2.signal函数:
signal(SIGALRM,statistic);
线程收到SIGALRM信号,暂停手头工作,开始执行void statistic(int)函数。statistic执行完后,线程回到被中断的那一点继续执行后面的语句。
3.setitimer函数:
int res = setitimer(ITIMER_REAL,&tick,NULL);
if(res != 0)
std::cout<<"set timer fail"<<std::endl;
参数解释:
ITIMER_REAL:指明定时器到时后发信号SIGALRM
tick:struct itimerval的变量,itimerval结构如下:
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
struct timeval {
long tv_sec;
long tv_usec;
};
tick.it_value指明定时器第一次触发时间,tick.it_interval指明触发间隔。
tick.it_value.tv_sec = 10;
tick.it_value.tv_usec = 0;
tick.it_interval.tv_sec = 5;
tick.it_interval.tv_usec = 0;
int res = setitimer(ITIMER_REAL,&tick,NULL);
if(res != 0)
std::cout<<"set timer fail"<<std::endl;
定时器10秒后将会触发,以后每隔5秒触发一次。触发后发SIGALRM信号。
成功返回0。
4.pause函数:
pause();
线程会被挂起,直至被信号中断。线程被唤醒后,继续执行pause后面的语句。
防止线程退出,使定时线程连续工作:
while(1)
pause();
5.time函数:
time_t t = time(NULL);
返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。
6.localtime函数:
struct tm *tb = localtime(&t); //上面得到的t
把从1970-1-1零点零分到某一时间点经过的秒数转换为本地时间。
此函数获得的tm结构体的时间是日历时间。
struct
tm {
int tm_sec; /* 秒 – 取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
int tm_year; /* 年份,其值等于实际年份减去1900 */
int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
};
月份从0开始,年份从1900开始。
所以给定一个秒数t,对应的真正日期为:
std::cout<<tb->tm_year+1900<<"."<<tb->tm_mon+1<<"."<<tb->tm_mday<<std::endl;
7.mktime函数:
time_t t = mktime(tb); //上面得到的tb
用来将参数tb所指的tm结构的日历时间转换成从公元1970年1月1日0时0分0 秒算起至今的UTC时间所经过的秒数。
8.定时线程模型,下一小时第一次触发,以后每隔一小时触发一次。例如当前为18:39,则17:00第一次触发。
printf("%04d-%02d-%02d\n",year,month,day);
输出:1994-02-07 d表示输出整数、2表示宽度、0表示不足两位前面补0,右对齐。
2.signal函数:
signal(SIGALRM,statistic);
线程收到SIGALRM信号,暂停手头工作,开始执行void statistic(int)函数。statistic执行完后,线程回到被中断的那一点继续执行后面的语句。
3.setitimer函数:
int res = setitimer(ITIMER_REAL,&tick,NULL);
if(res != 0)
std::cout<<"set timer fail"<<std::endl;
参数解释:
ITIMER_REAL:指明定时器到时后发信号SIGALRM
tick:struct itimerval的变量,itimerval结构如下:
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
struct timeval {
long tv_sec;
long tv_usec;
};
tick.it_value指明定时器第一次触发时间,tick.it_interval指明触发间隔。
tick.it_value.tv_sec = 10;
tick.it_value.tv_usec = 0;
tick.it_interval.tv_sec = 5;
tick.it_interval.tv_usec = 0;
int res = setitimer(ITIMER_REAL,&tick,NULL);
if(res != 0)
std::cout<<"set timer fail"<<std::endl;
定时器10秒后将会触发,以后每隔5秒触发一次。触发后发SIGALRM信号。
成功返回0。
4.pause函数:
pause();
线程会被挂起,直至被信号中断。线程被唤醒后,继续执行pause后面的语句。
防止线程退出,使定时线程连续工作:
while(1)
pause();
5.time函数:
time_t t = time(NULL);
返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。
6.localtime函数:
struct tm *tb = localtime(&t); //上面得到的t
把从1970-1-1零点零分到某一时间点经过的秒数转换为本地时间。
此函数获得的tm结构体的时间是日历时间。
struct
tm {
int tm_sec; /* 秒 – 取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
int tm_year; /* 年份,其值等于实际年份减去1900 */
int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
};
月份从0开始,年份从1900开始。
所以给定一个秒数t,对应的真正日期为:
std::cout<<tb->tm_year+1900<<"."<<tb->tm_mon+1<<"."<<tb->tm_mday<<std::endl;
7.mktime函数:
time_t t = mktime(tb); //上面得到的tb
用来将参数tb所指的tm结构的日历时间转换成从公元1970年1月1日0时0分0 秒算起至今的UTC时间所经过的秒数。
8.定时线程模型,下一小时第一次触发,以后每隔一小时触发一次。例如当前为18:39,则17:00第一次触发。
#include <time.h> #include <signal.h> #include <unistd.h> #include <sys/time.h> int main(){ pthread_t tid; if(pthread_create(&tid,NULL,func,NULL) != 0){ std::cout<<"timer thread create fail"<<std::endl; return 1; } while(1); //防止主线程退出 } void* func(void*){ signal(SIGALRM,statistic); time_t t1 = time(NULL); struct tm *tb = localtime(&t); tb->tm_hour++; tb->tm_min = 0; tb->tm_sec = 0; time_t t2 = mktime(tb); struct itimerval tick; tick.it_value.tv_sec = t2- t1; tick.it_value.tv_usec = 0; tick.it_interval.tv_sec = 3600; tick.it_interval.tv_usec = 0; int res = setitimer(ITIMER_REAL,&tick,NULL); if(res != 0) std::cout<<"set timer fail"<<std::endl; while(1) pause(); //线程睡在该处。当信号触发后,线程即刻转去执行信号处理函数。完成后,执行pause()后语句,故必须用while(1)循环,防止线程退出。 } void statistic(int){ std::cout<<"statistic work start"<<std::endl; }
相关文章推荐
- linux的查询时间实现秒定时+gettimeofday()函数的用法
- linux C 之时间函数
- linux时间函数描述-strptime
- linux 修改服务器时间更新同步,和定时任务
- linux 关于线程不安全函数localtime小记
- Linux 线程操作函数技能总结
- Linux下的定时器类实现(select定时+线程)
- Linux进程、线程中的常用函数
- linux时间函数
- linux中通过thread_create()函数成功后是不是线程就起来了呢?
- Linux下的函数执行时间的统计方法
- Linux系统编程:fork函数的使用【循环创建N个子线程】
- linux下统计程序/函数运行时间
- Linux的时间函数
- Linux 线程属性函数总结
- linux时间函数介绍
- Linux C语言 高精度时间函数:gettimeofday()
- Linux下通过gettimeofday函数获取程序段执行时间【推荐】
- Linux 0.11启动时间的计算函数
- Linux下的时间相关结构和函数