有關struct timeval結構體 以及 gettimeofday()函式

wzm10455發表於2013-04-20
轉載地址:http://blog.chinaunix.net/uid-20548989-id-2533161.html
一、struct timeval結構體
struct timeval結構體在time.h中的定義為:
  1. struct timeval
  2. {
  3. __time_t tv_sec;        /* Seconds. */
  4. __suseconds_t tv_usec;  /* Microseconds. */
  5. };
其中,tv_sec為Epoch到建立struct timeval時的秒數,tv_usec為微秒數,即秒後面的零頭。比如當前我寫博文時的tv_sec為1244770435,tv_usec為442388,即當前時間距Epoch時間1244770435秒,442388微秒。需要注意的是,因為迴圈過程,新建結構體變數等過程需消耗部分時間,我們作下面的運算時會得到如下結果:
  1. #include <sys/time.h>
  2. #include <stdio.h>
  3.   
  4. int
  5. main(void)
  6. {
  7.         int i;
  8.         struct timeval tv;

  9.         for(i = 0; i < 4; i++){
  10.                 gettimeofday(&tv, NULL);
  11.                 printf("%d\t%d\n", tv.tv_usec, tv.tv_sec);
  12.                 sleep(1);
  13.         }

  14.         return 0;
  15. }
  1. 329612 1314851429
  2. 329782 1314851430
  3. 329911 1314851431
  4. 330036 1314851432
前面為微秒數,後面為秒數,可以看出,在這個簡單運算中,只能精確到小數點後面一到兩位,或者可以看出,每進行一次迴圈,均需花費0.005秒的時間,用這個程式來作計時器顯然是不行的,除非精確計算產生的程式碼消耗時間。

二、gettimeofday()函式
原型:
  1. /* Get the current time of day and timezone information,
  2.    putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled.
  3.    Returns 0 on success, -1 on errors.
  4.    NOTE: This form of timezone information is obsolete.
  5.    Use the functions and variables declared in <time.h> instead. */
  6. extern int gettimeofday (struct timeval *__restrict __tv,
  7.                          __timezone_ptr_t __tz) __THROW __nonnull ((1));
gettimeofday()功能是得到當前時間和時區,分別寫到tv和tz中,如果tz為NULL則不向tz寫入。

相關文章