GNU/Linux >> Znalost Linux >  >> Linux

Může při vyvolání clock_gettime() vrácené pole tv_nsec skutečně přesáhnout sekundu?

Podle opengroup

Člen tv_nsec je platný pouze v případě, že je větší nebo roven nule a menší než počet nanosekund za sekundu (1000 milionů). Časový interval popsaný touto strukturou je (tv_sec * 10'-.4m'9'.4m'+ tv_nsec) nanosekundy.

Takže podle opengroup to vypadá oficiálně, že to musí být méně než 1 sekunda.


Jsem si docela jistý, že odpověď bude vždy "ne".

clock_gettime se nevrátí s tv_nsec>=10e9. clock_settime() a clock_nanosleep() oba ukládají toto omezení na své vstupy, takže jsem vždy předpokládal, že clock_gettime je v souladu s tím.

Také v Linuxu + glibc, pokud se ponoříte dostatečně hluboko do glibc, uvidíte kód takto:

Výňatek z 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;

K tomu dochází také v glibc/sysdeps/unix/clock_gettime.c.

Ale máš pravdu, manuálové stránky to neříkají. Alespoň ne to, co mám v distribuci Linuxu nebo na opengroup.org. Implementace tedy technicky podléhá změnám bez varování.

Pokud píšete pro Linux + glibc, řekl bych, že vaše bezpečí. Můžete sami zkontrolovat alternativní open source knihovny libc, např. Android bionic nebo zmenšená nová knihovna.

Pokud cílíte na jiný uzavřený systém POSIX, vy nebo váš klient máte problém s placením podpory, takže se zeptejte dodavatele, pokud to není zdokumentováno.

Pokud se snažíte být co nejvíce přenosní a cítíte se paranoidní, zabalte clock_gettime do „normalizační“ funkce, jako je tato:

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. Co se přesně stane, když spustím soubor v prostředí Shell?

  2. Kdy byl `relatime` nastaven jako výchozí?

  3. Je možné, aby dokončování Bash procházelo alternativami?

  1. Přepnutí na druhou X session zabije první?

  2. Kam jdou soubory, když je vydán příkaz Rm?

  3. Jak rozšířit plochu na druhou připojenou obrazovku?

  1. Jaký je význam caddr_t a kdy se používá?

  2. Kontrola, zda je dir. záznam vrácený readdir je adresář, odkaz nebo soubor. dent->d_type nezobrazuje typ

  3. Jaký je druhý stav v ip odkaz zobrazit výstup