2012-11-26 17 views
5

Quando tra cui la funzione sleep dal unistd.h il programma si blocca a tempo indeterminato:C non funzionante

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
     int i; 
     printf("0 "); 
     for(i = 1; i <20; ++i) 
     { 
      sleep(2); 
      printf("%d ", i); 
     } 
     printf("\n"); 

     return 0; 
} 

Il resto funziona benissimo quando sleep(2) è commentata, tutte le idee?

+0

Inoltre, la riga printf ("0") non viene eseguita, quindi non è un problema di orario in sleep(). –

+2

Buffering? Cosa succede se termini le stringhe stampate con una nuova riga? Modifica: funziona come previsto per me, 38 secondi di silenzio, e quindi i numeri vengono stampati. –

+2

Cosa succede se si esegue 'fflush (stdio);' ad ogni iterazione? –

risposta

8

Non c'è niente di sbagliato nel codice, ma si noti che in molti casi l'output di printf viene memorizzato nel buffer, il che significa che l'output viene visualizzato sulla console solo se si chiama esplicitamente fflush(stdout), si stampa una nuova riga o il buffer si riempie. Dal momento che non stampi una nuova riga fino alla fine, non vedrai nulla nel ciclo for per 40 secondi (perché le cose che printf stampano sono ancora nel buffer). Quindi, quando l'esecuzione tocca printf("\n"), tutto verrà stampato in una volta mentre il buffer viene svuotato.

Quindi, la linea di fondo è: o chiamare fflush(stdout) prima di chiamare sleep per assicurarsi che nulla rimanga nel buffer di output, o attendere 40 secondi e si otterrà l'output in un singolo batch alla fine.

0

Sei su un computer Windows? Se è così, includere nel vostro programma, e per mettere in pausa il programma, scrivere

Sleep(time_in_milliseconds) 

dove nel tuo caso time_in_milliseconds dovrebbe essere 2000.

D'altra parte, se siete su un computer basato su UNIX, il codice sembra buono.

3

hangs indefinitely implica che è bloccato o non deterministico, e ciò non accade. Il tuo codice funziona bene, dopo 38 secondi (19 * 2) Effettua una copia della stringa a contare da 0 a 19. Tuttavia ho il sospetto che questo è quello che stavi cercando per esso da fare:

int main() 
{ 
     int i; 
     printf("0 "); 
     fflush(stdout); // Force the output to be printed 
     for(i = 1; i <20; ++i) 
     { 
      sleep(2); 
      printf("%d ", i); 
      fflush(stdout); // Force the output to be printed 
     } 
     printf("\n"); 

     return 0; 
} 

il flusso stdout è tamponata e verrà visualizzato solo quando raggiunge una nuova riga '\n' o se si desidera visualizzarlo "in tempo reale" come la vostra chiamata printf() è necessario forzarlo per svuotare il buffer in un modo o nell'altro. Una chiamata a fflush(stdout) farà questo.

+0

Indovina che mi serve bene per essere impaziente. –

+0

@JamesJenkinson - :) Succede. I debugger sono carini per questo, quindi puoi vedere che sta facendo qualcosa, in mancanza, aspetta solo il tempo massimo che può 'dormire()' – Mike