1. 程式人生 > >linux下c/c++例項之六時間測試和定時器

linux下c/c++例項之六時間測試和定時器

一、簡介

      Linux中使用sleep會導致程式一直阻塞,無法互動,同時sleep和usleep有時也不精確,在此總結linux下的部分時間操作。

二、詳解

1、程式碼timer.cpp

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <assert.h>
#include <sys/time.h>
#include <signal.h>
using namespace std;
void timefunc(int signo)
{
    cout<<"signo:"<<signo<<endl;
    //signal(SIGALRM, timefunc);
    //alarm(1);
}
int gather_time()
{
    //時間定時器
    struct timeval tv;
    tv.tv_sec = 2;                   //tv_sec代表的是秒
    tv.tv_usec = 0;                  //tv_usec代表的是微秒(百萬分之一秒)精度
    select(0, NULL, NULL, NULL, &tv);

    //另一種時間定時器
    /*pthread_mutex_t log_mutex;
    pthread_cond_t log_check_cond;
    pthread_mutex_init(&log_mutex, NULL);
    pthread_cond_init(&log_check_cond, NULL);

    pthread_mutex_lock(&log_mutex);
    struct timespec timeout;
    struct timeval tv_start, tv_end;
    gettimeofday(&tv_start, NULL);
    timeout.tv_sec = tv_start.tv_sec + 1;    //1s的檢測時間
    timeout.tv_nsec = tv_start.tv_usec * 1000;
    pthread_cond_timedwait(&log_check_cond, &log_mutex, &timeout);
    gettimeofday(&tv_end, NULL);
    cout<<"time(秒):"<<(double)(1000000*(tv_end.tv_sec - tv_start.tv_sec) + (tv_end.tv_usec - tv_start.tv_usec))/1000000<<endl;
    pthread_mutex_unlock(&log_mutex);     //取佇列大小
    */

    //執行時間間隔
    double timeuse = 0.0;
    struct timeval start;
    struct timeval end;
    gettimeofday( &start, NULL );
    sleep(1);             //秒
    usleep(1000000);      //微秒(百萬分之一秒)
    gettimeofday( &end, NULL );
    timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;
    timeuse = (double)timeuse / 1000000;     //單位為秒
    cout<<"timeuse:"<<timeuse<<endl;

    //時間格式
    char format[32] = {0};
    char formatadd[32] = {0};
    time_t t_now;
    struct tm tm_time;
    t_now = time(NULL);
    localtime_r(&t_now, &tm_time);
    strftime(format, sizeof(format), "%Y%m%d%H%M%S", &tm_time); //日誌的時間
    strftime(formatadd, sizeof(formatadd), "%Y-%m-%d %H:%M:%S", &tm_time);
    cout<<"one:"<<format<<endl;
    cout<<"two:"<<formatadd<<endl;

    /*
    struct timeval {
      time_t tv_sec;       //秒 [long int]
      suseconds_t tv_usec; //微秒 [long int]
    };
    1秒=1000毫秒,
    1毫秒=1000微秒,
    1微妙=1000納秒,
    1納秒=1000皮秒。
    秒用s表現,毫秒用ms,微秒用μs表示,納秒用ns表示,皮秒用ps表示。
    */
    struct timeval tp;
    struct tm tm_t;
    char time_date[30] = {0};
    gettimeofday(&tp, NULL);
    localtime_r(&tp.tv_sec, &tm_time);              //另一種時間計算方法
    cout<<tm_time.tm_year + 1900<<"-"<<tm_time.tm_mon + 1<<"-"<<tm_time.tm_mday<<" "<<tm_time.tm_hour<<":"<<tm_time.tm_min<<":"<<tm_time.tm_sec<<endl;

    strftime(time_date, 30, "%Y-%m-%d %H:%M:%S:", &tm_time);
    sprintf(time_date + 20, "%d", tp.tv_usec);     //帶有微妙的時間
    cout<<time_date<<endl;

    //計算時間之差
    time_t first, last;
    time(&first);
    sleep(1);
    time(&last);
    cout<<difftime(last, first)<<endl;     //返回兩個time_t型變數之間的時間間隔

    struct timespec tv_t;
    tv_t.tv_sec = 0;
    tv_t.tv_nsec = 1000;    //tv_nsec以納秒為單位
    nanosleep(&tv_t, NULL);

    //定時器
//    signal(SIGALRM, timefunc);
//    alarm(1);

    //精度較高的定時功能
    //it_interval指定間隔時間,it_value指定初始定時時間
    //tv_sec提供秒級精度,tv_usec提供微秒級精度
    struct itimerval value;
    value.it_value.tv_sec = 1;
    value.it_value.tv_usec = 500000;
    value.it_interval.tv_sec = 1;
    value.it_interval.tv_usec = 500000;
    //ITIMER_PROF: 以該程序在使用者態下和核心態下所費的時間來計算,它送出SIGPROF訊號
    signal(SIGALRM, timefunc);
    assert(setitimer(ITIMER_REAL, &value, NULL) == 0);
    while(1)  sleep(1);
    return 0;
}

int main()
{
    gather_time();
    return 0;
}

2、編譯執行

g++ -o timer timer.cpp
./timer

三、總結

(1)pthread_cond_timedwait測試暫未通過,無法阻塞超時,感興趣的可以自己開啟註釋的語句進行測試(可能與系統有關)。
(2)若有建議,請留言,在此先感謝!