GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kann das zurückgegebene tv_nsec-Feld beim Aufrufen von clock_gettime() tatsächlich eine Sekunde überschreiten?

Laut opengroup

Das Mitglied tv_nsec ist nur gültig, wenn es größer oder gleich Null und kleiner als die Anzahl der Nanosekunden in einer Sekunde (1000 Millionen) ist. Das durch diese Struktur beschriebene Zeitintervall beträgt (tv_sec * 10'-.4m'9'.4m'+ tv_nsec) Nanosekunden.

Laut Opengroup sieht es also offiziell so aus, dass es weniger als 1 Sekunde sein muss.


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

clock_gettime wird nicht mit tv_nsec>=10e9 zurückkehren. clock_settime() und clock_nanosleep() legen beide diese Einschränkung für ihre Eingaben fest, daher bin ich immer davon ausgegangen, dass clock_gettime damit konsistent ist.

Auch unter Linux + glibc, wenn Sie tief genug in glibc graben, werden Sie Code wie diesen sehen:

Auszug aus glibc/nptl/pthread_clock_gettime.c:

/* Compute the seconds.  */
tp->tv_sec = tsc / freq;

/* And the nanoseconds.  This computation should be stable until
   we get machines with about 16GHz frequency.  */
tp->tv_nsec = ((tsc % freq) * 1000000000ull) / freq;

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

Aber Sie haben Recht, die Manpages sagen es nicht. Zumindest nicht das, was in meiner Linux-Distribution oder auf opengroup.org ist. Die Implementierung kann sich also technisch ohne Vorankündigung ändern.

Wenn Sie für Linux + glibc schreiben, würde ich sagen, Ihr Safe. Sie können alternative Open-Source-Libc-Bibliotheken selbst überprüfen, z. Bionic von Android oder die abgespeckte Newlib.

Wenn Sie auf ein anderes Closed-Source-POSIX-System abzielen, haben Sie oder Ihr Kunde Probleme, für den Support zu bezahlen, fragen Sie also den Anbieter, wenn dies nicht dokumentiert ist.

Wenn Sie versuchen, so portabel wie möglich zu sein und sich paranoid fühlen, umschließen Sie clock_gettime mit einer "normalisierenden" Funktion wie dieser:

int my_gettime( struct timespec * ts ) 
{  
   int ret; 
   if( 0 == (ret = clock_gettime(SOME_CLOCK, ts))
   {
      while (tv_nsec >= 1000000000 )
      {
         ts->tv_nsec -= 1000000000;
         ts->tv_sec += 1;
      }
   }
   return ret;
}

Linux
  1. Neuer übergeordneter Prozess, wenn der übergeordnete Prozess stirbt?

  2. Der Wechsel zu einer zweiten X-Sitzung tötet die erste?

  3. Wie erweitere ich den Desktop auf einen zweiten verbundenen Bildschirm?

  4. Sortieren nach dem letzten Feld einer Zeile

  5. Linux-Shell-Sortierdatei nach der zweiten Spalte?

Möge der Vierte über Podman mit dir sein

Wann wurde "Relatime" zum Standard gemacht?

Ist es möglich, dass die Bash-Vervollständigung die Alternativen durchläuft?

Wohin gehen Dateien, wenn der Rm-Befehl ausgegeben wird?

Was ist der zweite Status in der IP-Link-Show-Ausgabe

Wie starte ich im Einzelbenutzermodus eine zweite Shell?