您的位置:首页 > 运维架构 > Linux

时间函数和定时线程(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第一次触发。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: