Según opengroup
El miembro tv_nsec solo es válido si es mayor o igual a cero y menor que el número de nanosegundos en un segundo (1000 millones). El intervalo de tiempo descrito por esta estructura es (tv_sec * 10'-.4m'9'.4m'+ tv_nsec) nanosegundos.
Entonces, según opengroup, parece oficial que debe ser menos de 1 segundo.
Estoy bastante seguro de que la respuesta siempre será "no".
clock_gettime no regresará con tv_nsec>=10e9. clock_settime() y clock_nanosleep() colocan esta restricción en sus entradas, por lo que siempre asumí que clock_gettime era consistente con eso.
También en Linux + glibc, si profundiza lo suficiente en glibc, verá un código como este:
Extracto de 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;
Esto también ocurre en glibc/sysdeps/unix/clock_gettime.c.
Pero tienes razón, las páginas man no lo dicen. Al menos no lo que hay en mi distribución de Linux o en opengroup.org. Por lo tanto, la implementación está técnicamente sujeta a cambios sin previo aviso.
Si está escribiendo para Linux + glibc, diría que es seguro. Puede consultar las bibliotecas libc de código abierto alternativas usted mismo, p. El biónico de Android, o el newlib reducido.
Si tiene como objetivo algún otro sistema POSIX de código cerrado, usted o su cliente tienen problemas para pagar el soporte, así que pregúntele al proveedor si no está documentado.
Si trata de ser lo más portátil posible y se siente paranoico, envuelva clock_gettime con una función de "normalización" como esta:
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;
}