Linux システム時間には 2 種類あります。 (1)暦上の時刻。値は、指定された時刻、1970 年 1 月 1 日 00:00:00 (協定世界時 (UTC)) から経過した累積秒数です。基本的なデータ型は time_t を使用して保存されます。最後に、変換によって、通常表示される 24 時間または 12 時間の時間を取得できます。 (2)処理時間CPU 時間とも呼ばれ、プロセスによって使用される中央処理装置のリソースを測定します。プロセス時間はクロックティック単位で測定されます。 この記事では、Linux 時間の取得方法と使用方法について詳しく説明します。詳しい説明を見てみましょう。 タイムスタンプを取得 時間() #include <time.h> time_t 時間(time_t *calptr)
呼び出し例: #include <time.h> #include <iostream> #include <stdlib.h> 名前空間 std を使用します。 int メイン() { 現在の時刻。 curTime = 時間(NULL); cout << curTime << endl; 0を返します。 } 結果: gettimeofday() と clock_gettime() time 関数は秒単位の精度でのみ時刻を取得できます。より高精度のタイムスタンプを取得するには、他の関数が必要です。 gettimeofday 関数はマイクロ秒精度のタイムスタンプを取得し、timeval 構造体に保存できます。clock_gettime 関数はナノ秒精度のタイムスタンプを取得し、timespec 構造体に保存できます。 #include <sys/time.h> int gettimeofday(構造体 timeval *tp, void *tzp); 歴史的な理由により、tzp の唯一の有効な値は NULL なので、呼び出すときに NULL と記述するだけです。 int clock_gettime(clockid_t clock_id, strcut timespec *tsp); clock_id には複数のオプションがあります。CLOCK_REALTIME を選択した場合、機能は time に似ていますが、時間の精度が高くなります。 2 つの関数で使用される構造体は次のように定義されます。 構造体timeval { long tv_sec; /*秒*/ long tv_usec; /*マイクロ秒*/ }; 構造体タイムスペック { time_t tv_sec; //秒 long tv_nsec; //ナノ秒}; 呼び出し例: #include <time.h> #include <sys/time.h> #include <iostream> #include <stdlib.h> 名前空間 std を使用します。 int メイン() { タイムスタンプ dwCurTime1 = 時間(NULL); 構造体timeval stCurTime2; gettimeofday(&stCurTime2, NULL); 構造体timespec stCurTime3; clock_gettime(CLOCK_REALTIME、&stCurTime3); cout << "Time1: " << dwCurTime1 << "s" << endl; cout << "Time2: " << stCurTime2.tv_sec << "s, " << stCurTime2.tv_usec << "us" << endl; cout << "Time3: " << stCurTime3.tv_sec << "s、" << stCurTime3.tv_nsec << "ns" << endl; 0を返します。 } 結果:
時間を視覚化する tm構造 取得したタイムスタンプでは、現在の時刻を直感的に表示することはできません。そのため、日常生活で目にする時刻を表すには、tm 構造体を使用する必要があります。構造体は次のように定義されます。 構造体tm { int tm_sec; /*秒、通常の範囲は0〜59ですが、最大61まで許可されます*/ int tm_min; /*分、0-59*/ int tm_hour; /*時間、0-23*/ int tm_mday; /*日、つまり月の日、1~31*/ int tm_mon; /*1月から始まる月、0~11*/ 1+p->tm_mon; int tm_year; /*年、1900年から何年経過したか*/ 1900+ p->tm_year; int tm_wday; /*週、曜日、日曜日から始まる、0-6*/ int tm_yday; /*今年の1月1日から現在までの日数。範囲は0から365*/ int tm_isdst; /*夏時間フラグ*/ }; time_t から tm gmtime と localtime は、time_t 型のタイムスタンプを tm 構造体に変換できます。使用方法は次のとおりです。 構造体 tm* gmtime(const time_t *timep); //time_t で表される時間を、タイムゾーン変換なしで UTC 時間に変換します。これは、struct tm 構造体ポインターです。 stuct tm* localtime(const time_t *timep); //gmtime と似ていますが、タイムゾーン変換後の時刻、つまり北京時間に変換できます。 固定フォーマット印刷時間 tm 構造体を取得したら、日常使用のために文字列形式に変換するか、time_t から直接変換することができます。この目的を達成するには、次の 2 つの関数を使用できます。ただし、これら 2 つの関数は、固定形式でのみ時間を印刷できます。 //これら 2 つの関数は非推奨としてマークされています。後で紹介する関数を使用するようにしてください。char *asctime(const struct tm* timeptr); char *ctime(const time_t *timep); 呼び出し例: #include <time.h> #include <sys/time.h> #include <iostream> #include <stdlib.h> 名前空間 std を使用します。 int メイン() { タイムスタンプ dwCurTime1 = 時間(NULL); 構造体 tm* pTime; pTime = ローカルタイム(&dwCurTime1); char* strTime1; char* strTime2; strTime1 = asctime(pTime); strTime2 = ctime(&dwCurTime1); cout << strTime1 << endl; cout << strTime2 << endl; 0を返します。 } 結果:
柔軟で安全な時間変換関数 strftime() 上記の 2 つの関数は、バッファ オーバーフローの問題が発生する可能性があるため非推奨とされているため、より安全な方法は strftime メソッドを使用することです。 /* ** @buf: 出力時間を格納します ** @maxsize: バッファの最大バイト長 ** @format: 出力時間の形式を指定します ** @tmptr: 構造体 tm へのポインタ*/ size_t strftime(char* buf, size_t maxsize, const char *format, const struct tm *tmptr); timeptr に格納されている時間情報を、format で指定された形式に従って、format が指す文字列内の形式に従って buf に出力し、バッファ buf に最大 maxsize 文字を格納できます。この関数は、buf が指す文字列に配置された文字数を返します。 strftime() 関数は sprintf() と似た動作をします。つまり、パーセント記号 (%) で始まる一連のフォーマット コマンドを認識し、出力を文字列にフォーマットします。 format コマンドは、文字列 strDest 内のさまざまな日付と時刻の情報の正確な表現を指定します。フォーマット文字列内の他の文字は変更されずに文字列に配置されます。フォーマット コマンドは以下にリストされており、大文字と小文字が区別されます。
呼び出し例: #include <time.h> #include <sys/time.h> #include <iostream> #include <stdlib.h> 名前空間 std を使用します。 int メイン() { タイムスタンプ dwCurTime1 = 時間(NULL); 構造体 tm* pTime; pTime = ローカルタイム(&dwCurTime1); char buf[100]; strftime(buf, 100, "時間: %r, %a %b %d, %Y", pTime); cout << buf << endl; 0を返します。 } 結果:
時間関数の関係のグラフ 処理時間 プロセス時間とは、プロセスが作成されてから CPU を使用する時間です。プロセス時間は次の 2 つの部分に分かれています。
時計機能 clock 関数は、プロセス時間を取得するためのシンプルなインターフェイスを提供します。プロセスによって使用された合計 CPU 時間 (ユーザー時間とカーネル時間を含む) を表す値を返します。関数は次のように定義されます。 #include <time.h> clock_t クロック(void) //エラーの場合は-1を返す clock 関数は CLOCKS_PER_SEC 単位で値を返します。戻り値をこの単位で割ると、処理時間の秒数が得られます。 倍数関数 times 関数もプロセス時間関数であり、より具体的なプロセス時間表現を持ちます。関数の定義は次のとおりです。 #include <sys/times.h> clock_t times(構造体tms* buf); 構造体tms{ tms_utime は、クロックを生成する。 tms_stime は、クロックの経過時間を表します。 クロックtms_cutime; クロックtms_cstime; }; times 関数の戻り値の型は引き続き clock_t ですが、戻り値の測定単位は clock 関数とは異なります。 times 関数の戻り値の測定単位は、sysconf (SC_CLK_TCK) を通じて取得できます。 Linux システム プログラミング マニュアルの完全な使用例は次のとおりです。 #include <time.h> #include <sys/times.h> #include <unistd.h> #include <stdio.h> 静的 void displayProcessTime(const char* msg) { 構造体tmst; clock_t クロック時間; 静的ロングクロックティック = 0; (メッセージ!= NULL)の場合 { printf("%s\n", メッセージ); } (クロックティック == 0)の場合 { クロックティック = sysconf(_SC_CLK_TCK); (clockTick < 0) の場合、戻り値: } クロックタイム = クロック(); printf("クロックは%ld CLOCKS_PER_SEC (%.2f 秒) を返します\n", (long)clockTime, (double)clockTime/CLOCKS_PER_SEC); 回(&t); printf("times return user CPU = %.2f; system CPU = %.2f\n", (double)t.tms_utime / clockTick, (double)t.tms_stime / clockTick); } int メイン() { printf("CLOCKS_PER_SEC = %ld, sysconf(_SC_CLK_TCK) = %ld\n", (long)CLOCKS_PER_SEC, sysconf(_SC_CLK_TCK)); プロセス時間を表示します("開始:"); (int i = 0; i < 1000000000; ++i) の場合 { pid を取得します。 } printf("\n"); プロセス時間を表示します("終了:"); 0を返します。 } 参照する [1] http://www.runoob.com/w3cnote/cpp-time_t.html [2] 上級Unixプログラミング環境(第3版) [3] Unixシステムプログラミングマニュアル 要約する 上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。 以下もご興味があるかもしれません:
|
<<: JS を使用して配列内の要素の存在を 10 分で判断する
>>: MySQL で中国語を入力するときに発生するエラー 1366 の解決方法
この記事では、Jingdongの虫眼鏡効果を実現するためのJavaScriptの具体的なコードを紹介...
場合によっては、ジャンプを完了するために href の代わりにハイパーリンク <a> を...
目次概要オブジェクトにメソッドを定義するオブジェクトリテラルオブジェクトプロトタイプ動的コンテキスト...
1. haslayout と bfc は IE 固有の標準属性です。 2. BFC はページ上の分離...
この記事では、例を使用して、MySQL トリガーの原理と使用方法を説明します。ご参考までに、詳細は以...
innobackupex を使用してバックアップする際に MySQL がサーバーに接続できない場合は...
Dockerのインストール依存パッケージをインストールする sudo yum install -y ...
目次1. 父から息子へ2. 息子から父へ3. ブラザーコンポーネント通信(バス) 4. ref/re...
次のような要件があります: インポート ボタン。ボタンをクリックして Excel テーブルをインポー...
目次1 テストケース2 JS配列重複排除4種類2.1 要素の比較2.1.1 二重層 for ループ比...
最近、 Ubuntu 20.04でkazamを使用して録音しているときに、問題が見つかりました。シス...
まず、例を挙げてみましょう(読みたくない場合は、以下の要約だけ読んでください)。 order_typ...
Docker コンテナに入った後、コンテナを終了すると、コンテナは Exited 状態に変わります。...
ハイパーリンク <a> タグはリンク ポイントを表します。これは英語の単語「anchor...
<br /> テキスト、記号、リンクの3つの側面に焦点を当て、主に中国語で、個人的な執筆...