Nanosleep

Résolu
blackdead08 Messages postés 18 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 12 septembre 2006 - 11 sept. 2006 à 13:34
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 - 12 sept. 2006 à 16:38
exemple simple:
#include <stdio.h>
#include 

int main(int argc, char *argv[])
{
  int i;
  for(i=0; i<=5; i++)
    {
      printf("%d helloworld", i);
      usleep(1000000);
    }
  
  return 0;
}


Le programme devrait attendre 1 seconde avant d'afficher "helloworld" mais ce n'est pas le cas. Il attend 6secondes et affiche tout d'un coup...
je résoud le problème avec : printf("%d helloworld\n", i);
/*le retour à la ligne : \n*/

J'aimerai voir un exemple avec nanosleep car mon cher ami google m'a laissé tomber sur ce coup...

merci d'avance</stdio.h>

3 réponses

cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
12 sept. 2006 à 02:46
Les opérations d'entrées/sorties (disques, écran...) sont parmi les plus couteuses en temps qu'un système doit exécuter. Par conséquent, moins il en fait, mieux il se porte. Notamment pour le tampon de sortie écran, moins il aura à le vider, moins il le fera.
Le système ne vide ce tampon que dans quelques cas :
- Il est plein
- on le force à le vider (fflush(stdout) ou envoyer une chaine avec un retour chariot, par exemple)
- le système le vide tous les 'tant de temps'
Dans ton cas de chaînes sans retour chariot, c'est-à-dire sans conditions spéciales de vidage, le système adopte la politique du moindre effort et tant qu'il n'a pas rencontrer de conditions satisfaisantes, il ne fait rien (d'ou tes six secondes d'attentes et l'affichage de toutes les chaines d'un coup)
Dans le cas de tes chaines avec retour chariots, il rencontre une condition de vidage et il le fait, au fur et a mesure, tes chaines s'affichent 1 par seconde (à la louche)
Tu peux voir la même chose avec ça (remplacer le \n par un fflush()):
int main(int argc, char *argv[]) {
int i;
    for(i=0; i<=5; i++) {
    printf("%d helloworld", i);
    // fflush(stdout); // avant ou après usleep() c'est pareil
    usleep(1000000);
    fflush(stdout);
    }
return EXIT_SUCCESS;
}

le fflush(stdout) etant une autre condition pour forcer le système à vider le tampon, tes textes sont aussi affichés toutes les secondes, et non toutes ensembles au bout de six.

nanosleep() ne changera rien, je pense.

D'autre part si tu te documentes autour de usleep :
La fonction usleep() suspend
l'exécution du programme appelant durant usec microsecondes. La période
de sommeil peut être allongée par une charge système importante, et par
le temps passé à traiter l'appel de fonction.
 
et pour nanosleep :
nanosleep suspend l'exécution du
programme en cours pour une durée valant au moins *req. Cette fonction peut
se terminer plus tôt que prévu si un signal a été reçu par le processus.

Dans aucun des deux cas tu n'auras l'assurance que la seconde d'attente est respectée. Tu n'auras qu'une approximation de ta seconde.
3
blackdead08 Messages postés 18 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 12 septembre 2006
12 sept. 2006 à 15:35
Un grand merci AlexN
c'est vraiment très précis :-)
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
12 sept. 2006 à 16:38
de rien.
Coches la case 'réponse acceptée' pour que ça puisse servir à d'autres.
0
Rejoignez-nous