GNU/Linux >> Tutoriels Linux >  >> Linux

Lors de l'appel de clock_gettime(), le champ tv_nsec renvoyé peut-il réellement dépasser une seconde ?

Selon opengroup

Le membre tv_nsec n'est valide que s'il est supérieur ou égal à zéro et inférieur au nombre de nanosecondes dans une seconde (1000 millions). L'intervalle de temps décrit par cette structure est de (tv_sec * 10'-.4m'9'.4m'+ tv_nsec) nanosecondes.

Donc, selon opengroup, il semble officiel qu'il doit être inférieur à 1 seconde.


Je suis à peu près certain que la réponse sera toujours "non".

clock_gettime ne reviendra pas avec tv_nsec>=10e9. clock_settime() et clock_nanosleep() placent tous deux cette restriction sur leurs entrées, donc j'ai toujours supposé que clock_gettime était cohérent avec cela.

Aussi sur Linux + glibc, si vous creusez assez profondément dans glibc, vous verrez un code comme celui-ci :

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

Cela se produit également dans glibc/sysdeps/unix/clock_gettime.c.

Mais vous avez raison, les pages de manuel ne le disent pas. Du moins pas ce qu'il y a dans ma distribution Linux ou sur opengroup.org. La mise en œuvre est donc techniquement sujette à changement sans avertissement.

Si vous écrivez pour Linux + glibc, je dirais que votre coffre-fort. Vous pouvez vérifier vous-même d'autres bibliothèques libc open source, par ex. Le bionique d'Android, ou le newlib réduit.

Si vous ciblez un autre système POSIX à source fermée, vous ou votre client avez des problèmes pour payer le support, alors demandez au fournisseur si ce n'est pas documenté.

Si vous essayez d'être portable autant que possible et que vous vous sentez paranoïaque, enveloppez clock_gettime avec une fonction de "normalisation" comme celle-ci :

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. Nouveau processus parent lorsque le processus parent meurt ?

  2. Que se passe-t-il exactement lorsque j'exécute un fichier dans le shell ?

  3. Quand `relatime` a-t-il été défini par défaut ?

  4. Est-il possible que l'achèvement de Bash parcoure les alternatives ?

  5. Passer à une deuxième session X tue le premier ?

À quand remonte la dernière fois que vous avez utilisé Windows ?

Histoires Linux :quand les sauvegardes ont sauvé la journée

Que le Quatrième soit avec vous via Podman

Le type de partition fdisk est-il important lors de l'utilisation de lvm

Qu'est-ce qui constitue un 'champ' pour la commande cut ?

Comment démarrer un deuxième shell en mode mono-utilisateur ?