Linux系統編程3.時間概念

1. 時間表示

使用date命令輸出系統當前時間。

#include <time.h>
time_t time(time_t * tloc);
char*  ctime(const time_t *clock);
/*
    time 函數返回從 1970 年 1 月 1 日 0 點以來的秒數.存儲在 time_t 結構之中.不過這個函數的返回值對於我們來說沒有什麼實際意義.這個時候我們使用第二個函數將秒數轉化爲字符串.
    ctime這個函數的返回類型是固定的:一個可能值爲. Thu Dec 7 14: 58: 59 2000 這個字符串的長度是固定的爲 26.
*/

2. 時間測量

要計算程序執行的時間,比如對算法的時間要求

#include <sys/time.h>;
int gettimeofday(struct timeval *tv,struct timezone *tz);

strut timeval {
    long tv_sec;  /* 秒數 */
    long tv_usec; /* 微秒數 */
};
/*gettimeofday 將時間保存在結構 tv 之中.
  tz 一般使用 NULL 來代替*/

實例:

#include <sys/time.h>
#include <stdio.h>
#include <math.h>
void function()
{
    unsigned int i,j;
    double y;
    for(i=0;i<1000;i++)
    for(j=0;j<1000;j++)
    y=sin((double)i);
}
main()
{
    struct timeval tpstart,tpend;
    float timeuse;
    gettimeofday(&tpstart,NULL);
    function();
    gettimeofday(&tpend,NULL);
    timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
    tpend.tv_usec-tpstart.tv_usec;
    timeuse/=1000000;
    printf("Used Time: %f\n",timeuse);
    exit(0);
}
/*這個程序輸出函數的執行時間,我們可以使用這個來進行系統性能的測試,或者是函數算法的效率分析.*/

3. 使用計時器

linux系統爲每一個進程提供了3個內部間隔計時器。

ITIMER_REAL:    減少實際時間.到時的時候發出 SIGALRM 信號.
ITIMER_VIRTUAL: 減少有效時間(進程執行的時間).產生 SIGVTALRM 信號.
ITIMER_PROF:    減少進程的有效時間和系統時間(爲進程調度用的時間).

這個經常和上面一個使用用來計算系統內核時間和用戶時間.產生 SIGPROF 信號.

具體的操作函數是:

#include <sys/time.h>;
int getitimer(int which,struct itimerval *value);
/*getitimer 函數得到間隔計時器的時間值.保存在 value 中*/

int setitimer(int which,struct itimerval *newval,
struct itimerval *oldval);
/*setitimer 函數設置間隔計時器的時間值爲 newval.並將舊值保存在 oldval 中. */

struct itimerval {
    struct timeval it_interval;
    struct timeval it_value;
}


which     表示使用三個計時器中的哪一個.
itimerval 結構中的 it_value 是減少的時間,當這個值爲 0 的時候就發出相應的信號了. 然後設置爲 it_interval 值.

實例:

#include <sys/time.h>;
#include <stdio.h>;
#include <unistd.h>;
#include <signal.h>;
#include <string.h>;
#define PROMPT "時間已經過去了兩秒鐘\n\a"
char *prompt=PROMPT;
unsigned int len;
void prompt_info(int signo)
{
    write(STDERR_FILENO,prompt,len);
}
void init_sigaction(void)
{
    struct sigaction act;
    act.sa_handler=prompt_info;
    act.sa_flags=0;
    sigemptyset(&act.sa_mask);
    sigaction(SIGPROF,&act,NULL);
}
void init_time()
{
    struct itimerval value;
    value.it_value.tv_sec=2;
    value.it_value.tv_usec=0;
    value.it_interval=value.it_value;
    setitimer(ITIMER_PROF,&value,NULL);
}
int main()
{
    len=strlen(prompt);
    init_sigaction();
    init_time();
    while(1);
    exit(0);
}

這個程序每執行兩秒中之後會輸出一個提示.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章