c++ - rawtime - tm en c
diferencia entre gmtime_r y gmtime_s (2)
La diferencia es que gmtime_r(3)
es una función estándar de SUSv2 . Lo más cercano que puede encontrar a gmtime_r()
en un entorno de Windows es gmtime_s()
, que tiene sus argumentos invertidos:
-
gmtime_r(const time_t*, struct tm*)
-
gmtime_s(struct tm*, const time_t*)
Básicamente, ambos convierten un valor de tiempo en una estructura tm
. gmtime_r
luego devuelve un puntero a esta estructura (o NULL
si falla), mientras que gmtime_s
devuelve 0
si tiene éxito, y errno_t
en caso de falla.
La estructura tm
tiene el siguiente cuerpo, como puede verse en los dos documentos enumerados anteriormente:
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 */
};
¿Cuál es la diferencia entre estas dos funciones? Estoy usando MinGW 4.8.0.
Sé que gmtime_r
es seguro para subprocesos (pero no es seguro si se lo llama varias veces desde el mismo subproceso) pero no entiendo gmtime_s
gmtime_r
y gmtime_r
son funciones estándar de POSIX.
Su principal objetivo es la seguridad de los hilos (reentrada). Las gmtime
básicas de gmtime
y gmtime
no son seguras para subprocesos ni reentrantes, ya que usan una sola área estática para almacenar sus resultados, por lo que gmtime_r
y gmtime_r
llevan los punteros al lugar donde deben almacenarse los resultados.
Microsoft introdujo gmtime_s
y gmtime_s
y ahora son parte de C11, aunque el soporte que no es de Microsoft es limitado . (Vea here para mayor discusión.)
Su principal objetivo es la seguridad . Se agregaron como parte de Secure CRT (Secure C Run-Time) de Microsoft. Por lo que entiendo, la seguridad de los subprocesos no es un problema con gmtime
y gmtime
en el CRT de Microsoft, ya que las áreas de salida estática de estas funciones ya están asignadas por subproceso. En su lugar, se gmtime_s
y gmtime_s
para realizar la validación de parámetros de Secure CRT. (En otras palabras, verifican si sus parámetros son NULL, en cuyo caso invocan el manejo de errores).