Beim Aufruf von clock_gettime () darf das zurückgegebene tv_nsec-Feld tatsächlich eine Sekunde überschreiten?

8

Wenn Sie clock_gettime() aufrufen, wird eine Zeitspannenstruktur zurückgegeben.

%Vor%

Ich finde in der man-Seite keine Garantie, dass der tv_nsec eine Sekunde nicht überschreitet. Besteht die Garantie tatsächlich? Könnte es von der Bibliothek (glibc?) Implementierung für Linux abhängig sein?

Die Schlüsselidee ist: Muss ich ein Ergebnis aus der clock_gettime() -Funktion normalisieren?

    
yves Baumes 19.01.2015, 16:47
quelle

3 Antworten

6

Nach opengroup

  

Das tv_nsec-Mitglied ist nur gültig, wenn es größer oder gleich null ist, und   weniger als die Anzahl von Nanosekunden in einer Sekunde (1000 Millionen). Das   Zeitintervall, das durch diese Struktur beschrieben wird, ist (tv_sec * 10 '- 4m'9'4m'   + tv_nsec) Nanosekunden.

Also nach opengroup sieht es offiziell aus, dass es weniger als 1 Sekunde sein muss.

    
user590028 19.01.2015, 17:32
quelle
2

Ich bin ziemlich sicher, dass die Antwort immer "nein" sein wird.

clock_gettime wird nicht mit tv_nsec & gt; = 10e9 zurückgegeben. clock_settime () und clock_nanosleep () setzen beide diese Einschränkung auf ihre Eingaben, also habe ich immer angenommen, dass clock_gettime damit konsistent ist.

Auch auf Linux + glibc, wenn Sie tief genug in glibc graben, sehen Sie Code wie folgt:

Auszug aus glibc / nptl / pthread_clock_gettime.c:

%Vor%

Dies geschieht auch in glibc / sysdeps / unix / clock_gettime.c.

Aber Sie haben recht, die Manpages sagen nicht. Zumindest nicht, was in meiner Linux Distribution oder auf opengroup.org ist. Daher unterliegt die Implementierung technischen Änderungen ohne Warnung.

Wenn du für Linux + glibc schreibst, würde ich dich in Sicherheit bringen. Sie können alternative Open-Source-libc-Bibliotheken selbst prüfen, z. Android bionic oder die verkleinerte newlib.

Wenn Sie auf ein anderes POSIX-System mit geschlossenem Quellcode abzielen, haben Sie oder Ihr Kunde Probleme, für die Unterstützung zu bezahlen. Fragen Sie den Anbieter, ob er nicht dokumentiert ist.

Wenn Sie versuchen, so tragbar wie möglich zu sein und sich paranoid zu fühlen, wickeln Sie clock_gettime mit einer "Normalisierungs" -Funktion wie folgt ein:

%Vor%     
Brian McFarland 19.01.2015 17:24
quelle
1

Nein, Sie müssen das Ergebnis nicht normalisieren. Sie können darauf vertrauen, dass das Nanosekunden-Feld zwischen 0 und 999999999 liegt.

Die POSIX-Spezifikation für clock_gettime() gibt explizit an, dass clock_settime() mit% fehlschlägt. co_de% if EINVAL .

Die Standardpedanten mögen streiten, aber die einfache Symmetrie sagt uns, dass wir dasselbe von tv_nsec < 0 || tv_nsec >= 1000000000 erwarten können. Technisch gesehen ist 100000000 ns eine Sekunde, und da der Standard konsequent den Begriff "Sekunden und Nanosekunden" verwendet , ist die logische Schlussfolgerung, dass das Nanosekundenfeld normalisiert werden soll. Außerdem werden viele Programme auf interessante und faszinierende Weise unterbrochen, wenn clock_gettime() Ergebnisse mit Nanosekunden-Feldern außerhalb der Grenzen zurückgibt.

    
Nominal Animal 19.01.2015 17:31
quelle

Tags und Links