Qual è la differenza tra queste due funzioni? Sto usando MinGW 4.8.0.differenza tra gmtime_r e gmtime_s
so che gmtime_r
è thread-safe (ma non sicuro se chiamati tempo multiple dallo stesso filo), ma non capisco gmtime_s
Qual è la differenza tra queste due funzioni? Sto usando MinGW 4.8.0.differenza tra gmtime_r e gmtime_s
so che gmtime_r
è thread-safe (ma non sicuro se chiamati tempo multiple dallo stesso filo), ma non capisco gmtime_s
La differenza è che gmtime_r(3)
è un standard SUSv2 function. Il più vicino si possono trovare a gmtime_r()
su un ambiente Windows è gmtime_s()
, che ha i suoi argomenti invertite:
gmtime_r(const time_t*, struct tm*)
gmtime_s(struct tm*, const time_t*)
In sostanza, entrambi convertire un valore di tempo a una struttura tm
. gmtime_r
quindi restituire un puntatore a questa struttura (o NULL
in caso di errore), mentre gmtime_s
restituisce 0
in caso di esito positivo e un errno_t
in caso di errore.
La struttura tm
ha il corpo segue, come si può vedere da entrambi i documenti sopra elencati:
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 */
};
sono entrambi thread-safe? –
Per quanto riguarda gmtime_s: come da quello che posso vedere, Windows le funzioni standard localtime e gmtime sono già thread-safe, quindi sì – streppel
come per quanto riguarda gmtime_r, [preso da qui] (http://linux.die.net/man/3/gmtime_r): "The quattro funzioni asctime(), ctime(), gmtime() e localtime() restituire un puntatore a dati statici e quindi non sono thread-safe thread-safe versioni asctime_r(), ctime_r(). , gmtime_r() e localtime_r() sono specificati da SUSv2" – streppel
gmtime_r
e localtime_r
sono funzioni POSIX standard.
Il loro scopo principale è sicurezza thread (rientranza). Le base gmtime
e localtime
funzioni non sono thread-safe o rientrante, perché utilizzano una singola area statica per memorizzare i loro risultati, così gmtime_r
e localtime_r
prese puntatori a cui memorizzare i risultati.
gmtime_s
e localtime_s
sono stati introdotti da Microsoft e ora fanno parte di C11, anche se non-Microsoft support is limited. (Vedere here per ulteriori discussioni.)
Il loro scopo principale è sicurezza. Sono stati aggiunti come parte di Microsoft Secure CRT (Secure C Run-Time). Da quello che ho capito, la sicurezza thread non è un problema con gmtime
e localtime
in CRT di Microsoft, in quanto aree di uscita statici queste funzioni sono già assegnati per thread. Invece, sono stati aggiunti gmtime_s
e localtime_s
fare Secure CRT parameter validation. (In altre parole, controllano se i loro parametri sono NULL, nel qual caso invocano la gestione degli errori.)
'gmtime_s' e' localtime_s' sono anche in C11. – Lyberta
@FaTony - L'avevo dimenticato. Grazie per l'info; Ho aggiornato la mia risposta. –
possibile duplicato di [Qual è l'equivalente di Windows della funzione Unix gmtime \ _r?] (Http: // stackoverflow. it/questions/12044519/what-is-the-windows-equivalent-of-the-unix-function-gmtime-r) – o11c