Funzione Sleep() in linguaggio C

Funzione Sleep In Linguaggio C



Quando sviluppiamo programmi che richiedono l'interazione dell'utente, ci sono casi in cui è necessario regolare gli orari del sistema in modo che l'applicazione sia leggibile e facile da usare.

Ad esempio, se stiamo sviluppando un'applicazione console in cui dobbiamo informare l'utente delle attività che verranno eseguite in sequenza, i messaggi informativi dovrebbero persistere per un tempo ragionevole in modo che l'utente abbia il tempo di leggerli prima che vengano cancellati e il programma passa al comando successivo.

In questo articolo di Linuxhint imparerai come utilizzare la funzione sleep() per creare ritardi in tempo reale. Ti mostreremo la sintassi e la descrizione di questa funzione, nonché le opzioni fornite da POSIX per creare ritardi con frazioni inferiori a un secondo. Poi, attraverso esempi pratici, codici e immagini, ti mostreremo come ritardare l'esecuzione di un programma e gli effetti dei segnali su questa funzione.








Sintassi della funzione Sleep() in linguaggio C



non firmato int sonno ( non firmato int sez )

Descrizione della funzione Sleep() in linguaggio C

La funzione sleep() mette il processo o il thread in modalità di sospensione per il tempo in secondi specificato nell'argomento di input 'sec' che è un numero intero senza segno. Una volta chiamata la funzione sleep(), il processo chiamante dorme finché non scade o riceve un segnale.



Questa funzione viene spesso utilizzata per imporre lunghi ritardi superiori a 1 secondo nell'esecuzione di processi in tempo reale. Per ritardi inferiori a 1 secondo, POSIX fornisce la funzione di risoluzione in microsecondi, usleep(), che utilizza la stessa chiamata al metodo di sleep(). Per ritardi inferiori a 1 microsecondo esiste anche la funzione nanosleep() con risoluzione di 1 nanosecondo, ma con un metodo di chiamata diverso in cui utilizza le strutture “timespec” come argomenti di input per impostare il tempo di ritardo.





Se la funzione sleep() ha consumato tutto il tempo specificato, restituisce 0 come risultato. Se l'esecuzione viene interrotta dall'arrivo di un segnale prima che sia trascorso il tempo specificato, restituisce il numero di secondi rimanenti fino a quel momento.

La funzione sleep() è definita nell'intestazione 'unistd.h'. Per usarlo, dobbiamo includere questo file nel codice come segue:



#include

Come introdurre ritardi in un processo con la funzione Sleep()

In questo esempio creiamo un timer che consiste in un loop infinito in cui stampiamo il messaggio “Tempo trascorso” nella console di comando, seguito dai secondi trascorsi del processo. Ciascuno di questi cicli viene ripetuto ogni 2 secondi a causa del ritardo causato dalla funzione sleep().

Per fare ciò, prendiamo un file vuoto con l'estensione '.c' e aggiungiamo le intestazioni 'stdio.h' e 'unistd.h'. Quindi apriamo una funzione main() vuota e definiamo in essa la variabile secondi di tipo int che utilizzeremo come contatore del tempo trascorso.

Una volta inserite le intestazioni e dichiarata la variabile, apriamo un ciclo infinito e utilizziamo la funzione printf() al suo interno per visualizzare il messaggio e il valore temporale. Nella riga successiva incrementiamo la variabile time di 2 e quindi chiamiamo la funzione sleep() con il valore 2 come argomento di input. In questo modo questo ciclo si ripete ogni secondo e otteniamo un contatore che visualizza sullo schermo il tempo trascorso. Ora diamo un'occhiata al codice di questa applicazione. Vediamo il codice completo per questo esempio:

#include
#include

vuoto principale ( )
{
int secondi = 0 ;
Mentre ( 1 )
{
printf ( 'Tempo trascorso: %i \N ' , secondi ) ;
secondi += 2 ;
sonno ( 2 ) ;
}

}

Di seguito vedremo un'immagine con la compilazione e l'esecuzione di questo codice. Come possiamo vedere, ogni 2 secondi, il programma stampa sullo schermo i secondi trascorsi dall'esecuzione del processo.

Effetto dei segnali sulla funzione Sleep()

In questo esempio, vogliamo osservare l'effetto dei segnali su un processo che viene messo in stato di stop utilizzando la funzione sleep(). Per fare ciò, creiamo una semplice applicazione composta da una funzione main() e un gestore per il segnale 36.

Nella prima riga della funzione main() dichiariamo la restante variabile di tipo int dove memorizziamo il valore restituito dalla funzione sleep(). Quindi, utilizziamo la funzione signal() per associare il gestore al segnale 36. Nella riga successiva, visualizziamo il PID del processo che poi utilizziamo per inviare un segnale da una seconda shell al processo. Infine, chiamiamo la funzione sleep() e impostiamo il suo argomento di input su 60 secondi, un tempo sufficiente per inviare un segnale da una seconda shell. Inviamo la variabile rimanente come argomento di output a sleep().

Il gestore collegato al segnale 36 è costituito da una riga di codice in cui la funzione printf() stampa il messaggio 'Tempo rimanente:' seguito dal valore restituito da sleep() nel momento in cui il segnale arriva al processo. Ecco, diamo un'occhiata al codice per questo esempio.

#include
#include
#include
#include

vuoto gestore ( int residuo ) ;

vuoto principale ( )
{
int residuo ;
segnale ( 36 , gestore ) ;
printf ( 'ID processo: %i \N ' , getpid ( ) ) ;
residuo = sonno ( 60 ) ;
}

vuoto gestore ( int residuo )

{
printf ( 'Tempo rimanente: %i \N ' , residuo ) ;
}

L'immagine seguente che vediamo mostra la compilazione e l'esecuzione di questo codice:

Per vedere l'effetto dei segnali in questo processo, compiliamo questo codice e lo eseguiamo. Successivamente, da un secondo terminale, inviamo un segnale con la seguente sintassi:

uccisione - n segnale PID

L'immagine seguente che vediamo mostra l'esecuzione del codice nella console precedente e gli effetti dell'arrivo di un segnale inviato dalla console successiva. Come puoi vedere, il segnale ha soppresso l'effetto della funzione sleep() risvegliando il processo:

Conclusione

In questo articolo di Linuxhint, ti abbiamo mostrato come usare la funzione sleep() per mettere un processo in stop per un numero specificato di secondi. Ti abbiamo anche mostrato la sintassi, la descrizione della funzione e il metodo di chiamata.

Usando esempi pratici, frammenti di codice e immagini, ti abbiamo mostrato come mettere un processo in stato di stop e cosa influenza l'arrivo di un segnale su un processo in stato di stop utilizzando la funzione sleep().