GNU/Linux >> Tutoriales Linux >  >> Linux

Al invocar clock_gettime(), ¿puede el campo tv_nsec devuelto realmente exceder un segundo?

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

Linux
  1. ¿Cuándo fue la última vez que usó Windows?

  2. Historias de Linux:cuando las copias de seguridad salvaron el día

  3. ¿Nuevo proceso principal cuando muere el proceso principal?

  4. ¿Cambiar a una segunda sesión X mata a la primera?

  5. ¿Cómo extender el escritorio a una segunda pantalla conectada?

Que el Cuarto te acompañe a través de Podman

¿Es posible que la finalización de Bash pase por las alternativas?

¿A dónde van los archivos cuando se emite el comando Rm?

Comprobando si un dir. la entrada devuelta por readdir es un directorio, enlace o archivo. dent->d_type no muestra el tipo

¿Es importante el tipo de partición fdisk cuando se usa lvm?

¿Qué constituye un 'campo' para el comando de corte?