2013-09-27 12 views
14

Welcher ist der Unterschied zwischen diesen beiden Funktionen? Ich verwende MinGW 4.8.0.Unterschied zwischen gmtime_r und gmtime_s

Ich weiß, dass gmtime_r ist Thread-sicher (aber nicht sicher, wenn mehr Mal aus dem gleichen Thread genannt), aber ich verstehe nicht gmtime_s

+0

mögliches Duplikat von [Was ist das Windows-Äquivalent der Unix-Funktion gmtime \ _r?] (Http: // stackoverflow. com/questions/12044519/Was-ist-das-Windows-Äquivalent-der-Unix-Funktion-gmtime-r) – o11c

Antwort

13

Der Unterschied besteht darin, dass gmtime_r(3) ein standard SUSv2 function ist. Die nächstgelegene Sie gmtime_r() auf einer Windows-Umgebung finden kann, ist gmtime_s(), die ihre Argumente umgekehrt hat:

  • gmtime_r(const time_t*, struct tm*)
  • gmtime_s(struct tm*, const time_t*)

Grundsätzlich sie beide einen Zeitwert zu einer tm Struktur umwandeln. gmtime_r dann einen Zeiger auf diese Struktur zurückgeben (oder NULL, wenn fehlgeschlagen), während gmtime_s0 zurückgegeben, wenn erfolgreich, und errno_t im Fehlerfall.

tm Die Struktur hat die folgende Körper ist, wie aus den beiden oben genannten docs gesehen werden:

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

sind sie beide Thread-sicher? –

+0

In Bezug auf gmtime_s: aus dem, was ich sehen kann, die Windows die Standard Localtime und GMT-Funktionen sind bereits Thread-sicher, so ja – streppel

+0

wie für gmtime_r, [von hier] (http://linux.die.net/man/3/gmtime_r): "Die vier Funktionen asctime(), ctime(), gmtime() und localtime() geben einen Zeiger auf statische Daten zurück und sind daher nicht Thread-sicher. Thread-sichere Versionen asctime_r(), ctime_r() , gmtime_r() und localtime_r() werden von SUSv2 " – streppel

7

gmtime_r und localtime_r sind Standard POSIX-Funktionen.

Ihr Hauptzweck ist Thread Sicherheit (Reentrancy). Die grundlegenden Funktionen gmtime und sind nicht thread-sicher oder reentrant, da sie einen einzigen statischen Bereich zum Speichern ihrer Ergebnisse verwenden. Daher müssen gmtime_r und localtime_r Hinweise darauf enthalten, wo die Ergebnisse gespeichert werden sollen.

gmtime_s und localtime_s wurden von Microsoft eingeführt und sind jetzt Teil von C11, obwohl non-Microsoft support is limited. (Weitere Informationen finden Sie unter here.)

Ihr Hauptzweck ist Sicherheit. Sie wurden als Teil von Microsofts Secure CRT (Secure C Run-Time) hinzugefügt. Soweit ich weiß, ist Thread-Sicherheit mit gmtime und in Microsofts CRT kein Problem, da die statischen Ausgabebereiche dieser Funktionen bereits pro Thread zugewiesen sind. Stattdessen wurden gmtime_s und localtime_s hinzugefügt, um die Secure CRT parameter validation zu tun. (Mit anderen Worten, sie prüfen, ob ihre Parameter NULL sind. In diesem Fall rufen sie die Fehlerbehandlung auf.)

+0

'gmtime_s' und' localtime_s' sind ebenfalls in C11. – Lyberta

+0

@FaTony - das hatte ich vergessen. Danke für die Info; Ich habe meine Antwort aktualisiert. –