2013-09-27 4 views
14

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

+0

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

risposta

13

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 */ 
}; 
+0

sono entrambi thread-safe? –

+0

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

+0

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

7

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

+0

'gmtime_s' e' localtime_s' sono anche in C11. – Lyberta

+0

@FaTony - L'avevo dimenticato. Grazie per l'info; Ho aggiornato la mia risposta. –