2010-01-04 8 views
3

Je n'arrive pas à comprendre comment afficher quelque chose (comme Hello World) toutes les 3 secondes. J'écris seulement en programmation C avec le compilateur gcc sous linux. Nous pouvons l'arrêter en appuyant sur Ctrl + c. Je veux juste la manière la plus simple et la plus facile de manipuler le code avec mon projet.Afficher quelque chose toutes les 3 secondes

Merci beaucoup d'avance!

Répondre

6

Vous pouvez rencontrer un problème dans la sortie standard est normalement tamponnées, ce qui signifie que les lots de mise en œuvre jusqu'à la sortie jusqu'à ce qu'il est plus pratique d'écrire. Si vous écrivez toutes les trois secondes (et sleep(3) est un bon moyen de le faire), et qu'il ne s'affiche pas toutes les trois secondes, essayez de mettre fflush(stdout); ou d'écrire dans la sortie d'erreur standard avec `fprintf (stderr, n ").

+1

Vous me sauvez. fflush (stdout) doit être utilisé pour montrer tous les changements. – Devyn

+1

@Devyn, peut-être alors vous devriez accepter cette réponse à la place? –

4
sleep(3); 

La fonction sleep permet à votre programme d'attendre X secondes avant de revenir. Notez que c'est entre les exécutions, donc il ne sera pas exécuté votre commande exactement toutes les 3 secondes, mais assez proche pour la plupart des buts. En outre, certaines plates-formes ont usleep où vous représente micro qui pourrait vous obtenir plus de résolution. Voir les pages man pour plus d'informations.

+0

merci pour la réponse. Avons-nous besoin d'un en-tête spécial pour cela? – Devyn

+2

'unistd.h': http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html –

9
while(1) { 
    printf("something\n"); 
    sleep(3); 
} 
+0

J'ai juste un curseur clignotant. Rien ne se montre! Que devrais-je faire? – Devyn

+9

@Devyn, attendez trois secondes. –

+0

Eh bien, j'ai attendu plus de 10 secondes.Voici mon code complet. #include #include int main (void) { while (1) { printf ("quelque chose \ n"); sommeil (3); } } – Devyn

1

L'approche générique consiste à écrire une boucle infinie (while (1) { ... }) et de mettre en pause l'exécution de chaque programme.

Pour mettre en pause, vous pouvez utiliser la fonction sleep de la bibliothèque standard. Alternativement à sleep, qui ne peut spécifier que le temps de sommeil en secondes, vous pouvez utiliser la fonction nanosleep qui permet une meilleure précision.

#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    struct timespec t = { 3/*seconds*/, 0/*nanoseconds*/}; 
    while (1){ 
    printf("Wait three seconds and...\n"); 
    nanosleep(&t,NULL); 
    fflush(stdout); //see below 
    } 
} 

Notez que si vous ajoutez un caractère de nouvelle ligne (\n) à la chaîne que vous outpu, vous avez très probablement ne verrez rien, car la chaîne est d'abord imprimé à un tampon et que le tampon est parfois rincé à la terminal (ce qui arrive généralement lorsque vous imprimez un saut de ligne, mais même cela ne peut pas garantir le flush sur chaque système). C'est pourquoi il est préférable d'ajouter l'appel fflush.

0

Le type de tampon du flux peut être contrôlé à l'aide de la fonction setvbuf(). Par défaut, les flux faisant référence aux fichiers sont mis en mémoire tampon et les terinals sont bufférisés en ligne (stdout) ou unbuffered (stderr).

#include <stdio.h> 

int main(int argc, char* argv[]) { 
    setvbuf(stdout, NULL, _IONBF, 0); 
    while (1) { 
     printf("Wait 3 seconds... "); 
     sleep(3); 
    } 
} 

Notez qu'il n'y a pas \ n dans printf. Si vous commentez l'appel setvbuf() vous pouvez voir comment toutes les sorties viennent à la fois après avoir rempli le tampon (habituellement 1024 octets).

1

seulement lointainement lié, mais une technique que j'utilise tout le temps est d'écrire un programme pour afficher quelque chose une fois puis répéter tous les n secondes en utilisant /usr/bin/watch. Je reçois beaucoup plus de réutilisation de cette façon.

Questions connexes