web-dev-qa-db-ja.com

gmtime_rとgmtime_sの違い

これら2つの機能の違いはどれですか? MinGW4.8.0を使用しています。

そんなこと知ってる gmtime_rはスレッドセーフです(ただし、同じスレッドから複数回呼び出された場合は安全ではありません)が、私にはわかりませんgmtime_s

18
elvis.dukaj

違いは、 gmtime_r(3)標準のSUSv2関数 であるということです。 Windows環境でgmtime_r()に最も近いのは gmtime_s() で、引数が逆になっています。

  • gmtime_r(const time_t*, struct tm*)
  • gmtime_s(struct tm*, const time_t*)

基本的に、どちらも時間値をtm構造に変換します。 gmtime_r次に、この構造体へのポインタ(または、失敗した場合はNULL)を返しますが、gmtime_s 戻り値 0成功した場合、およびerrno_t失敗した場合。

上記の両方のドキュメントからわかるように、tm構造の本体は次のとおりです。

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 */
};
18
Natan Streppel

gmtime_rおよびlocaltime_rは標準のPOSIX関数です。

それらの主な目的は、スレッドセーフ(再入可能)です。基本的なgmtime関数とlocaltime関数は、結果を格納するために単一の静的領域を使用するため、スレッドセーフまたは再入可能ではありません。したがって、gmtime_rおよびlocaltime_r結果を保存する場所へのポインタを取得します。

gmtime_sおよびlocaltime_sはMicrosoftによって導入され、現在はC11の一部ですが、 Microsoft以外のサポートは制限されています 。 (詳細については、 ここ を参照してください。)

それらの主な目的はセキュリティです。これらは、Microsoftの Secure CRT (Secure C Run-Time)の一部として追加されました。私の理解では、MicrosoftのCRTのgmtimelocaltimeはスレッドごとに割り当てられているため、これらの関数の静的出力領域はスレッドセーフの問題ではありません。代わりに、gmtime_sおよびlocaltime_s Secure CRTを実行するために追加されました パラメータ検証 。 (つまり、パラメーターがNULLかどうかをチェックします。NULLの場合は、エラー処理を呼び出します。)

10
Josh Kelley