Разница между 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, и в этом случае они вызывают обработку ошибок.)