82 votes

Comment utiliser nanosleep() en C? Quels sont `tim.tv_sec` et `tim.tv_nsec`?

Quel est l'utilisation de tim.tv_sec et tim.tv_nsec dans ce qui suit ?

Comment puis-je mettre en veille l'exécution pendant 500000 microsecondes ?

#include 
#include 

int main()
{
   struct timespec tim, tim2;
   tim.tv_sec = 1;
   tim.tv_nsec = 500;

   if(nanosleep(&tim , &tim2) < 0 )   
   {
      printf("L'appel système de mise en veille nanoseconde a échoué \n");
      return -1;
   }

   printf("Mise en veille nanoseconde réussie \n");

   return 0;
}

79voto

NPE Points 169956

Une demi-seconde équivaut à 500 000 000 nanosecondes, donc votre code doit être :

tim.tv_sec  = 0;
tim.tv_nsec = 500000000L;

Tel que c'est écrit actuellement, votre code dort pendant 1,0000005s (1s + 500ns).

2 votes

Cool. Juste une dernière question. Je teste cela en utilisant gettimeofday() deux fois et en obtenant la différence. J'ai donc obtenu une différence de une demi-seconde. Mais il y avait aussi une très petite fraction de seconde, due au temps de traitement du processeur. Comment puis-je calculer cela et le soustraire de mon temps de sommeil. mon temps est venu comme suit : 0.501033 sec

2 votes

@pnizzle: Que cherchez-vous exactement à réaliser avec cette soustraction?

2 votes

Je espère obtenir exactement 0.500000secs. Merci

56voto

Dave Points 6972

tv_nsec est le temps de sommeil en nanosecondes. 500000us = 500000000ns, donc vous voulez :

nanosleep((const struct timespec[]){{0, 500000000L}}, NULL);

2 votes

Quel est le ´L` à la fin de 500000000L pour?

3 votes

Cela concerne le long double. en tant que deuxième argument de nanosleep() ont un type long double. voir stackoverflow.com/questions/1380653/…

1 votes

Le type de la deuxième variable de la structure nanosleep est long. L est utilisé pour convertir le nombre en long, car int peut être trop petit pour gérer la valeur. Certains standards de sécurité (NASA, MISRA) obligent à spécifier le type de nombre si le nombre est supérieur à 2^16 pour éviter les codes erronés.

12voto

glglgl Points 35668

500000 microsecondes sont égales à 500000000 nanosecondes. Vous ne devez attendre que 500 ns = 0.5 µs.

9voto

Sunny Shukla Points 187

Cela a fonctionné pour moi ....

#include <stdio.h>
#include <time.h>   /* Nécessaire pour la structure timespec */

int mssleep(long miliseconds)
{
   struct timespec rem;
   struct timespec req= {
       (int)(miliseconds / 1000),     /* secondes (doit être non négatif) */ 
       (miliseconds % 1000) * 1000000 /* nano (doit être dans la plage de 0 à 999999999) */ 
   };

   return nanosleep(&req , &rem);
}

int main()
{
   int ret = mssleep(2500);
   printf("résultat du sommeil %d\n",ret);
   return 0;
}

0 votes

Alors ce n'est pas nsleep(...) mais msleep(...) ?

1 votes

C'est juste un caractère de plus pour épeler correctement les millisecondes.

8voto

E.T Points 955

Je utilise généralement des #define et des constantes pour faciliter le calcul:

#define NANO_SECOND_MULTIPLIER  1000000  // 1 milliseconde = 1 000 000 nanosecondes
const long INTERVAL_MS = 500 * NANO_SECOND_MULTIPLIER;

Ainsi, mon code ressemblerait à ceci:

timespec sleepValue = {0};

sleepValue.tv_nsec = INTERVAL_MS;
nanosleep(&sleepValue, NULL);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X