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?
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
?
Kann das tv_nsec
-Feld im Prinzip mehr als 1 Sekunde Nanosekunden speichern?
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:
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.