Разница между gmtime_r и gmtime_s

Какая разница между этими двумя функциями? Я использую MinGW 4.8.0.

Я знаю, что gmtime_r является потокобезопасным (но не безопасным, если вызвано многократное время из того же потока), но я не понимаю gmtime_s

Ответы

Ответ 1

Отличие состоит в том, что gmtime_r(3) является стандартной функцией SUSv2. Наиболее близким к gmtime_r() в среде Windows является 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 */
};

Ответ 2

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). Насколько я понимаю, безопасность потоков не является проблемой с gmtime и localtime в Microsoft CRT, так как статические области вывода этих функций уже выделены для каждого потока. Вместо этого были добавлены gmtime_s и localtime_s, чтобы выполнить проверку безопасности Secure CRT . (Другими словами, они проверяют, являются ли их параметры NULL, и в этом случае они вызывают обработку ошибок.)