Nanosleep [Résolu]

blackdead08
Messages postés
18
Date d'inscription
vendredi 23 décembre 2005
Dernière intervention
12 septembre 2006
- 11 sept. 2006 à 13:34 - Dernière réponse : cs_AlexN
Messages postés
719
Date d'inscription
lundi 5 décembre 2005
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>
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
cs_AlexN
Messages postés
719
Date d'inscription
lundi 5 décembre 2005
Dernière intervention
8 janvier 2014
- 12 sept. 2006 à 02:46
3
Merci
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.

Merci cs_AlexN 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cs_AlexN
blackdead08
Messages postés
18
Date d'inscription
vendredi 23 décembre 2005
Dernière intervention
12 septembre 2006
- 12 sept. 2006 à 15:35
0
Merci
Un grand merci AlexN
c'est vraiment très précis :-)
Commenter la réponse de blackdead08
cs_AlexN
Messages postés
719
Date d'inscription
lundi 5 décembre 2005
Dernière intervention
8 janvier 2014
- 12 sept. 2006 à 16:38
0
Merci
de rien.
Coches la case 'réponse acceptée' pour que ça puisse servir à d'autres.
Commenter la réponse de cs_AlexN

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.