Funkcija Sleep() v jeziku C

Funkcija Sleep V Jeziku C



Ko razvijamo programe, ki zahtevajo interakcijo uporabnika, obstajajo primeri, ko je treba sistemske čase prilagoditi tako, da je aplikacija berljiva in enostavna za uporabo.

Na primer, če razvijamo konzolno aplikacijo, kjer moramo uporabnika obvestiti o nalogah, ki se bodo izvajale v zaporedju, morajo informacijska sporočila obstajati razumen čas, tako da jih ima uporabnik čas prebrati, preden se počistijo in program preide na naslednji ukaz.

V tem članku o Linuxhintu se boste naučili, kako uporabiti funkcijo sleep() za ustvarjanje zamud v realnem času. Pokazali vam bomo sintakso in opis te funkcije ter možnosti, ki jih ponuja POSIX za ustvarjanje zamud z delčki, krajšimi od sekunde. Nato vam bomo s praktičnimi primeri, kodami in slikami pokazali, kako zakasniti izvajanje programa in učinke signalov na to funkcijo.








Sintaksa funkcije Sleep() v jeziku C



nepodpisan int spati ( nepodpisan int sek )

Opis funkcije Sleep() v jeziku C

Funkcija sleep() preklopi proces ali nit v stanje spanja za čas v sekundah, ki je naveden v vhodnem argumentu »sec«, ki je celo število brez predznaka. Ko je funkcija sleep() enkrat poklicana, klicni proces spi, dokler ne poteče čas ali prejme signal.



Ta funkcija se pogosto uporablja za uveljavljanje dolgih zakasnitev, daljših od 1 sekunde, pri izvajanju procesov v realnem času. Za zakasnitve, krajše od 1 sekunde, POSIX nudi funkcijo mikrosekundne ločljivosti, usleep(), ki uporablja isti klic metode kot sleep(). Za zakasnitve, manjše od 1 mikrosekunde, je na voljo tudi funkcija nanosleep() z ločljivostjo 1 nanosekundo, vendar z drugačno klicno metodo, kjer uporablja strukture »timespec« kot vhodne argumente za nastavitev časa zakasnitve.





Če je funkcija sleep() porabila ves določen čas, kot rezultat vrne 0. Če je izvajanje prekinjeno s prihodom signala pred potekom določenega časa, vrne preostalo število sekund do tega časa.

Funkcija sleep() je definirana v glavi »unistd.h«. Če ga želimo uporabiti, moramo to datoteko vključiti v kodo, kot sledi:



#include

Kako uvesti zamude v procesu s funkcijo Sleep().

V tem primeru ustvarimo časovnik, ki je sestavljen iz neskončne zanke, v kateri na ukazni konzoli natisnemo sporočilo »Pretečeni čas«, ki mu sledijo pretečene sekunde postopka. Vsaka od teh zank se ponovi vsaki 2 sekundi zaradi zakasnitve, ki jo povzroči funkcija spanja().

Da bi to naredili, vzamemo prazno datoteko s pripono '.c' in vanjo dodamo glavi 'stdio.h' in 'unistd.h'. Nato odpremo prazno funkcijo main() in v njej definiramo spremenljivko seconds tipa int, ki jo bomo uporabili kot števec pretečenega časa.

Ko so glave vstavljene in je spremenljivka deklarirana, odpremo neskončno zanko in v njej uporabimo funkcijo printf() za prikaz sporočila in časovne vrednosti. V naslednji vrstici povečamo časovno spremenljivko za 2 in nato pokličemo funkcijo sleep() z vrednostjo 2 kot vhodnim argumentom. Na ta način se ta cikel ponavlja vsako sekundo in dobimo števec, ki na zaslonu prikazuje pretečeni čas. Zdaj pa si poglejmo kodo za to aplikacijo. Oglejmo si celotno kodo za ta primer:

#include
#include

praznina glavni ( )
{
int sekund = 0 ;
medtem ( 1 )
{
printf ( 'Pretečeni čas: %i \n ' , sekund ) ;
sekund += 2 ;
spati ( 2 ) ;
}

}

V nadaljevanju bomo videli sliko s prevajanjem in izvajanjem te kode. Kot lahko vidimo, program vsaki 2 sekundi na zaslon izpiše pretekle sekunde od izvedbe procesa.

Vpliv signalov na funkcijo Sleep().

V tem primeru želimo opazovati učinek signalov na proces, ki je prestavljen v stanje mirovanja s funkcijo sleep(). Da bi to naredili, ustvarimo preprosto aplikacijo, ki je sestavljena iz funkcije main() in upravljalnika za signal 36.

V prvi vrstici funkcije main() deklariramo preostalo spremenljivko tipa int, kamor shranimo vrednost, ki jo vrne funkcija sleep(). Nato uporabimo funkcijo signal(), da povežemo upravljalnik s signalom 36. V naslednji vrstici prikažemo PID procesa, ki ga nato uporabimo za pošiljanje signala iz druge lupine procesu. Na koncu pokličemo funkcijo sleep() in nastavimo njen vhodni argument na 60 sekund, kar je dovolj dolgo, da pošlje signal iz druge lupine. Preostalo spremenljivko pošljemo kot izhodni argument za spanje().

Obravnavalnik, ki je priložen signalu 36, je sestavljen iz vrstice kode, kjer funkcija printf() natisne sporočilo »Preostali čas:«, ki mu sledi vrednost, ki jo vrne sleep() v trenutku, ko signal prispe v proces. Tukaj si poglejmo kodo za ta primer.

#include
#include
#include
#include

praznina vodja ( int preostalih ) ;

praznina glavni ( )
{
int preostalih ;
signal ( 36 , vodja ) ;
printf ( 'ID procesa: %i \n ' , getpid ( ) ) ;
preostalih = spati ( 60 ) ;
}

praznina vodja ( int preostalih )

{
printf ( 'Preostali čas: %i \n ' , preostalih ) ;
}

Naslednja slika, ki jo vidimo, prikazuje prevajanje in izvajanje te kode:

Da bi videli učinek signalov v tem procesu, prevedemo to kodo in jo zaženemo. Nato iz drugega terminala pošljemo signal z naslednjo sintakso:

ubiti - n signal PID

Naslednja slika, ki jo vidimo, prikazuje izvajanje kode v prejšnji konzoli in učinke prihoda signala, ki je poslan iz naslednje konzole. Kot lahko vidite, je signal zadušil učinek funkcije spanja() tako, da je prebudil proces:

Zaključek

V tem članku o Linuxhintu smo vam pokazali, kako uporabiti funkcijo sleep() za preklop procesa v stanje spanja za določeno število sekund. Pokazali smo vam tudi sintakso ter opis funkcije in klicne metode.

S pomočjo praktičnih primerov, izrezkov kode in slik smo vam pokazali, kako s funkcijo spanja () preklopite proces v stanje mirovanja in kaj vpliva na prihod signala v procesu mirovanja.