read rawtime localtime_r how estructura c++ time thread-safety

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).