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;
}