Funkcija Sleep() u jeziku C

Funkcija Sleep U Jeziku C



Kada razvijamo programe koji zahtijevaju interakciju korisnika, postoje slučajevi kada je potrebno prilagoditi sistemska vremena kako bi aplikacija bila čitljiva i laka za korištenje.

Na primjer, ako razvijamo konzolnu aplikaciju u kojoj moramo obavijestiti korisnika o zadacima koji će se izvršavati u slijedu, informativne poruke bi trebale trajati razumno vrijeme kako bi ih korisnik imao vremena pročitati prije nego što se izbrišu i program prelazi na sljedeću naredbu.

U ovom članku o Linuxhintu naučit ćete kako koristiti funkciju sleep() za stvaranje kašnjenja u stvarnom vremenu. Pokazat ćemo vam sintaksu i opis ove funkcije, kao i opcije koje POSIX pruža za stvaranje kašnjenja s djelićima manjim od sekunde. Zatim ćemo vam pomoću praktičnih primjera, kodova i slika pokazati kako odgoditi izvršenje programa i učinke signala na ovu funkciju.








Sintaksa funkcije Sleep() u jeziku C



nepotpisan int spavati ( nepotpisan int sek )

Opis Sleep() funkcije u jeziku C

Funkcija sleep() stavlja proces ili nit u stanje mirovanja na vrijeme u sekundama koje je navedeno u ulaznom argumentu 'sec' koji je cijeli broj bez predznaka. Nakon što se pozove funkcija sleep(), pozivni proces spava dok ne istekne ili ne primi signal.



Ova se funkcija često koristi za nametanje dugih odgoda od više od 1 sekunde u izvršavanju procesa u stvarnom vremenu. Za kašnjenja manja od 1 sekunde, POSIX osigurava mikrosekundnu rezoluciju, usleep(), koja koristi isti poziv metode kao sleep(). Za kašnjenja manja od 1 mikrosekunde također postoji funkcija nanosleep() s rezolucijom od 1 nanosekunde, ali s drugom metodom poziva gdje koristi strukture 'timespec' kao ulazne argumente za postavljanje vremena kašnjenja.





Ako je funkcija sleep() potrošila sve navedeno vrijeme, vraća 0 kao rezultat. Ako se izvršenje prekine dolaskom signala prije isteka navedenog vremena, vraća preostali broj sekundi do tog vremena.

Funkcija sleep() definirana je u zaglavlju “unistd.h”. Da bismo ga koristili, moramo uključiti ovu datoteku u kod na sljedeći način:



#include

Kako uvesti kašnjenja u proces s funkcijom Sleep().

U ovom primjeru stvaramo mjerač vremena koji se sastoji od beskonačne petlje u kojoj ispisujemo poruku 'Proteklo vrijeme' u naredbenoj konzoli, nakon koje slijede protekle sekunde procesa. Svaka od ovih petlji se ponavlja svake 2 sekunde zbog kašnjenja koje uzrokuje funkcija sleep().

Da bismo to učinili, uzmemo praznu datoteku s ekstenzijom '.c' i dodamo joj zaglavlja 'stdio.h' i 'unistd.h'. Zatim otvorimo praznu main() funkciju i u njoj definiramo varijablu seconds tipa int koju ćemo koristiti kao brojač proteklog vremena.

Nakon što su zaglavlja umetnuta i varijabla deklarirana, otvaramo beskonačnu petlju i koristimo funkciju printf() u njoj za prikaz poruke i vremenske vrijednosti. U sljedećem retku povećavamo varijablu vremena za 2, a zatim pozivamo funkciju sleep() s vrijednošću 2 kao ulaznim argumentom. Na taj način se ovaj ciklus ponavlja svake sekunde i dobivamo brojač koji na ekranu prikazuje proteklo vrijeme. Sada, pogledajmo kôd za ovu aplikaciju. Pogledajmo cijeli kod za ovaj primjer:

#include
#include

poništiti glavni ( )
{
int sekundi = 0 ;
dok ( 1 )
{
printf ( 'Proteklo vrijeme: %i \n ' , sekundi ) ;
sekundi += 2 ;
spavati ( 2 ) ;
}

}

U nastavku ćemo vidjeti sliku s kompilacijom i izvođenjem ovog koda. Kao što vidimo, svake 2 sekunde program na ekranu ispisuje protekle sekunde od izvršenja procesa.

Učinak signala na funkciju Sleep().

U ovom primjeru želimo promatrati učinak signala na proces koji je stavljen u stanje mirovanja pomoću funkcije sleep(). Da bismo to učinili, kreiramo jednostavnu aplikaciju koja se sastoji od funkcije main() i rukovatelja za signal 36.

U prvom retku funkcije main() deklariramo preostalu varijablu tipa int gdje spremamo vrijednost koju vraća funkcija sleep(). Zatim koristimo funkciju signal() za vezanje rukovatelja na signal 36. U sljedećem retku prikazujemo PID procesa koji potom koristimo za slanje signala iz druge ljuske procesu. Konačno, pozivamo funkciju sleep() i postavljamo njen ulazni argument na 60 sekundi, dovoljno dugo da pošalje signal iz druge ljuske. Preostalu varijablu šaljemo kao izlazni argument za sleep().

Rukovatelj koji je priložen signalu 36 sastoji se od retka koda gdje funkcija printf() ispisuje poruku 'Preostalo vrijeme:' nakon koje slijedi vrijednost koju vraća sleep() u trenutku kada signal stigne u proces. Evo, pogledajmo kod za ovaj primjer.

#include
#include
#include
#include

poništiti rukovatelj ( int preostalih ) ;

poništiti glavni ( )
{
int preostalih ;
signal ( 36 , rukovatelj ) ;
printf ( 'ID procesa: %i \n ' , dobitipid ( ) ) ;
preostalih = spavati ( 60 ) ;
}

poništiti rukovatelj ( int preostalih )

{
printf ( 'Preostalo vrijeme: %i \n ' , preostalih ) ;
}

Sljedeća slika koju vidimo prikazuje kompilaciju i izvođenje ovog koda:

Da bismo vidjeli učinak signala u ovom procesu, kompajliramo ovaj kod i pokrećemo ga. Zatim, s drugog terminala, šaljemo signal sa sljedećom sintaksom:

ubiti - n signal PID

Sljedeća slika koju vidimo prikazuje izvođenje koda u prethodnoj konzoli i efekte dolaska signala koji se šalje sa sljedeće konzole. Kao što vidite, signal je potisnuo učinak funkcije sleep() buđenjem procesa:

Zaključak

U ovom članku o Linuxhintu pokazali smo vam kako koristiti funkciju sleep() za stavljanje procesa u stanje mirovanja na određeni broj sekundi. Također smo vam pokazali sintaksu kao i opis funkcije i metode pozivanja.

Koristeći praktične primjere, isječke koda i slike, pokazali smo vam kako staviti proces u stanje mirovanja i što utječe na dolazak signala na proces mirovanja pomoću funkcije sleep().