TRASLOCO
Sempre mosso dalla voglia di allontanarmi da Google e dai suoi servizi, ho finalmente deciso che dopo diversi anni la piattaforma di questo piccolo spazio andava cambiata. Finalmente il blo cambia casa. Se volete trovarmi potete recarvi al nuovo indirizzo

martedì 25 agosto 2009

Didattica C/C++: Creare un'interruzione in secondi

Alle volte può succedere di aver bisogno di interrompere il regolare svolgimento di un codice scritto in C per un tempo di n secondi. Le strade da intraprendere in questo caso possono essere diverse: si potrebbe controllare , ad esempio l'ora di sistema con un ciclo ed uscirne solo quando sono passati i secondi desiderati. Questa soluzione, per quanto logica possa essere, porta problemi in termini di uso di CPU. E' più facile, pertanto, ricorrere ad una semplicissima funziona del linguaggio C contenuta nella libreria unistd.h. La funzione in questione è sleep che ha il seguente prototipo:

unsigned int sleep(unsigner int second)


dove
second è il tempo (espresso in secondi) per cui si vuole che il processo sia fermo.

Ovviamente la praticità di questa funzione è evidente ma proprio l'altro giorno mentre utilizzavo questo metodo mi sono imbattuto in un errore.
Il programma in questione era qualcosa del tipo:

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

int main()
{
int i;

for (i=0;i<=4;i++)
{
printf("stringa");
sleep(1);
}

return 0;
}


Nel terminale infatti avrei dovuto vedere stampata una parola ogni secondo per un tempo di 4 secondi; quando però lanciavo via terminale il mio programma compilato notavo che le mie parole venivano stampate tutte insieme senza tenere conto dell'attesa di sleep. Dov'era allora il problema? Bene il problema risiedeva in dei problemi di bufferizzazione dell'ouput standard. Il problema è facilmente arginabile ponendo un fflush(stdout) dopo lo sleep; fflush infatti forza la scrittura dei dati presenti nel buffer. Pertanto, molto semplicemente il codice diventa:

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

int main()
{
int i;

for (i=0;i<=4;i++)
{
printf("stringa");
sleep(1);
fflush(stdout);
}

return 0;
}


Spero di essere stato utile.....alla prossima!