linuxでの一般的な時間関数


linuxの下でプログラミングして、いくつかのよく使う時間関数があって、以下は1つの総括をして整理します.
1、time
SYNOPSIS
       #include 

       time_t time(time_t *t);

DESCRIPTION
       time() returns the time since the Epoch (00:00:00 UTC, January 1, 1970), mea-
       sured in seconds.

       If t is non-NULL, the return value is also stored in the memory pointed to by
       t.


まず、time_tタイプは符号付き整数であり、32ビットシステムの下、32ビット符号数、64ビットシステムの下、64ビット符号数である.ではtime関数はUTC時間1970年1月1日00:00:00から現在までの秒数を返し、32ビットにシンボル数が格納されている場合、2038年にこの値がオーバーフローし、このような大きな数を格納できなくなります.
この関数はtime_に渡されますtポインタは、この入力メモリに時間を書き込むと同時にtimeもこの値を返し、なんだか余計な感じがします.戻り値を使うか、ポインタを使うか.
int now = time(NULL); //      

2、localtime
 struct tm *localtime(const time_t *timep);
 struct tm *localtime_r(const time_t *timep, struct tm *result);

 struct tm {
               int tm_sec;         /* seconds */
               int tm_min;         /* minutes */
               int tm_hour;        /* hours */
               int tm_mday;        /* day of the month */
               int tm_mon;         /* month */
               int tm_year;        /* year */
               int tm_wday;        /* day of the week */
               int tm_yday;        /* day in the year */
               int tm_isdst;       /* daylight saving time */
           };
/*
The members of the tm structure are:

       tm_sec    The  number of seconds after the minute, normally in the range 0 to
                 59, but can be up to 60 to allow for leap seconds.

       tm_min    The number of minutes after the hour, in the range 0 to 59.

       tm_hour   The number of hours past midnight, in the range 0 to 23.

       tm_mday   The day of the month, in the range 1 to 31.

       tm_mon    The number of months since January, in the range 0 to 11.

       tm_year   The number of years since 1900.
       tm_wday   The number of days since Sunday, in the range 0 to 6.

       tm_yday   The number of days since January 1, in the range 0 to 365.

       tm_isdst  A flag that indicates whether daylight saving time is in effect  at
                 the  time described.  The value is positive if daylight saving time
                 is in effect, zero if it is not, and negative if the information is
                 not available.

*/

この2つの関数はtime_tのタイムスタンプはローカルで読みやすい時間に変換され,肝心なのはtm構造体であり,注釈は既に明らかである.この2つの関数の違いは,前者はスレッドが安全ではない関数であり,後者はスレッド関数である.最初の関数を見て、理由もなくポインタを返します.このような状況はめったに見られません.実は、このポインタは関数内部の静的に割り当てられた構造体を指しています.他のスレッドに書き換えられる可能性があります.だから、安全ではありません.できるだけ2番目を使ってください.
3、gettimeofday
#include 

int gettimeofday(struct timeval *tv, struct timezone *tz);

struct timeval {
               time_t      tv_sec;     /* seconds */
               suseconds_t tv_usec;    /* microseconds */
           };
 struct timezone {
               int tz_minuteswest;     /* minutes west of Greenwich */
               int tz_dsttime;         /* type of DST correction */
           };


この関数はまた、現在の時間を得ることができ、マイクロ秒レベルに達することができ、第1のパラメータtvポインタから伝達され、第2のパラメータtzは廃棄され、NULLに伝達される.
timeval構造体、保存秒数とマイクロ秒数も、UTC時間1970年1月1日00:00:00から計算されます.
試験手順:
#include 
#include 
#include

int main ()
{
  struct  timeval tv;
  gettimeofday(&tv,NULL);
  printf("second=%d
"
, tv.tv_sec); printf("microseconds=%d
"
, tv.tv_usec); printf("time=%d
"
, time(0)); return 0; }[KentZhang@LOCAL-192-168-97-2 ]$ ./a.out second=1543334965 microseconds=963832 time=1543334965

4、clock_gettime
#include 

int clock_gettime(clockid_t clk_id, struct timespec *tp);
/*
clk_id        ,     2 ,  3    。
CLOCK_REALTIME //       ,  time()
              System-wide real-time clock.  Setting this clock requires  appropriate
              privileges.
CLOCK_MONOTONIC //                
              Clock  that  cannot  be  set  and represents monotonic time since some
              unspecified starting point.
CLOCK_MONOTONIC_RAW (since Linux 2.6.28; Linux-specific)
              Similar to CLOCK_MONOTONIC, but provides access  to  a  raw  hardware-
              based time that is not subject to NTP adjustments.
CLOCK_PROCESS_CPUTIME_ID
              High-resolution per-process timer from the CPU.
CLOCK_THREAD_CPUTIME_ID
              Thread-specific CPU-time clock.
*/    

//         ,          
struct timespec {
    time_t   tv_sec;        /* seconds */
    long     tv_nsec;       /* nanoseconds */
};


この関数はシステムのクロック時間を取得し、CPUのクロックと関係があるため、精度が高いと言われています.