Kann eine Zeitangabe mehr als 1 Sekunde Nanosekunden im Feld tv_nsec haben?

8

Ich arbeite mit dem clock_gettime() -Befehl und versuche, eine bestimmte Anzahl von Millisekunden an die timespec anzuhängen, die ich davon bekomme. Kann ich das einfach machen?

%Vor%

oder muss ich es aufteilen und herausfinden, ob es ganze Sekunden gibt, fügen Sie diese zum tv_sec -Feld hinzu und fügen Sie dann die restlichen zu tv_nsec ?

hinzu

Kann das tv_nsec -Feld im Prinzip mehr als 1 Sekunde Nanosekunden speichern?

    
Nealon 14.06.2013, 17:47
quelle

2 Antworten

12

Es hängt ganz davon ab, was Sie damit machen werden.

Die tv_nsec Mitglieder eines struct timespec haben den Typ long . Sie können einen beliebigen Wert im Bereich LONG_MIN bis LONG_MAX festlegen. Wenn Sie eine Berechnung durchführen, die LONG_MAX überschreitet, was mindestens 2 31 -1 ist, werden Sie Probleme haben (undefiniertes Verhalten, das wahrscheinlich angezeigt wird) wie der Wert umwickelt).

Ob ein Wert kleiner als 0 oder größer als oder gleich einer Milliarde ist, hängt davon ab, was Sie damit tun. Wenn Sie es nur ausdrucken oder Berechnungen daran vornehmen möchten, sollte jeder gültige long -Wert in Ordnung sein - aber die gespeicherten Werte sind wahrscheinlich nützlicher, wenn Sie sie normalisieren.

clock_gettime() sollte Ihnen immer einen tv_nsec Wert im Bereich 0..999999999 geben.

POSIX erfordert, dass die Funktionen clock_settime() , clock_nanosleep() und nanosleep() fehlschlagen, und setzen Sie errno auf EINVAL , wenn "Das tp Argument einen Nanosekundenwert kleiner als null oder größer als oder gleich 1000 Millionen. "

Referenzen:

Ссылка Ссылка Ссылка

    
Keith Thompson 14.06.2013, 18:40
quelle
1

Ein tv_nsec -Feld toleriert einen begrenzten Betrag des Nanosekunden-Überlaufs (immer genug, um zwei gültige Werte für die Zeitprozent-Nanosekunde hinzuzufügen, also 999999999 + 999999999 = 1999999998). Es gibt jedoch keine Garantie dafür, dass eine willkürliche Menge an Überlauf funktioniert: Bei Implementierungen mit 32-Bit long können Sie nur bis zu zwei Sekunden im Wert von Nanosekunden auf 2.147483647 Sekunden gehen. Wenn also jemand sagt, dass er 2500 Millisekunden (2,5 Sekunden) hinzufügen soll, würde das überlaufen.

Zum Hinzufügen hinzufügen: und, wie Keith Thompson bemerkt, müssen Sie nach dem Hinzufügen eines Zeitzeichens zu einem anderen erneut normalisieren.

    
torek 14.06.2013 18:39
quelle

Tags und Links