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...
cs_AlexN
Messages postés694Date d'inscriptionlundi 5 décembre 2005StatutMembreDernière intervention 8 janvier 201419 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.