Funkce Sleep() v jazyce C

Funkce Sleep V Jazyce C



Když vyvíjíme programy, které vyžadují interakci uživatele, nastávají případy, kdy je nutné upravit systémové časy tak, aby byla aplikace čitelná a snadno ovladatelná.

Pokud například vyvíjíme konzolovou aplikaci, kde potřebujeme informovat uživatele o úlohách, které budou provedeny v pořadí, měly by informační zprávy přetrvávat po přiměřenou dobu, aby si je uživatel stihl přečíst, než budou vymazány. program přejde na další příkaz.

V tomto článku Linuxhint se dozvíte, jak používat funkci sleep() k vytváření zpoždění v reálném čase. Ukážeme vám syntaxi a popis této funkce a také možnosti, které POSIX poskytuje k vytvoření zpoždění se zlomky menšími než jedna sekunda. Potom vám na praktických příkladech, kódech a obrázcích ukážeme, jak zpozdit provedení programu a vliv signálů na tuto funkci.








Syntaxe funkce Sleep() v jazyce C



nepodepsaný int spát ( nepodepsaný int sek )

Popis funkce Sleep() v jazyce C

Funkce sleep() uvede proces nebo vlákno do režimu spánku na dobu v sekundách, která je určena ve vstupním argumentu „sec“, což je celé číslo bez znaménka. Jakmile je zavolána funkce sleep(), volající proces uspí, dokud nevyprší časový limit nebo dokud nepřijme signál.



Tato funkce se často používá k vynucení dlouhých zpoždění delších než 1 sekunda při provádění procesů v reálném čase. Pro zpoždění kratší než 1 sekunda poskytuje POSIX funkci rozlišení mikrosekund, usleep(), která používá stejné volání metody jako sleep(). Pro zpoždění menší než 1 mikrosekundu existuje také funkce nanosleep() s rozlišením 1 nanosekunda, ale s jinou metodou volání, kde jako vstupní argumenty pro nastavení doby zpoždění používá struktury „timespec“.





Pokud funkce sleep() spotřebovala celý zadaný čas, vrátí jako výsledek 0. Pokud je provádění přerušeno příchodem signálu před uplynutím zadaného času, vrátí zbývající počet sekund do tohoto času.

Funkce sleep() je definována v hlavičce „unistd.h“. Abychom jej mohli použít, musíme tento soubor zahrnout do kódu následovně:



#include

Jak zavést zpoždění v procesu pomocí funkce Sleep()

V tomto příkladu vytvoříme časovač, který se skládá z nekonečné smyčky, ve které vytiskneme zprávu „Uplynulý čas“ v příkazové konzoli, po níž následují uplynulé sekundy procesu. Každá z těchto smyček se opakuje každé 2 sekundy kvůli zpoždění způsobenému funkcí sleep().

Chcete-li to provést, vezmeme prázdný soubor s příponou „.c“ a přidáme do něj záhlaví „stdio.h“ a „unistd.h“. Poté otevřeme prázdnou funkci main() a definujeme v ní proměnnou sekund typu int, kterou použijeme jako čítač uplynulého času.

Jakmile jsou záhlaví vložena a proměnná je deklarována, otevřeme nekonečnou smyčku a pomocí funkce printf() v ní zobrazíme zprávu a hodnotu času. Na dalším řádku zvýšíme časovou proměnnou o 2 a poté zavoláme funkci sleep() s hodnotou 2 jako vstupním argumentem. Tímto způsobem se tento cyklus opakuje každou sekundu a získáme počítadlo, které na obrazovce zobrazuje uplynulý čas. Nyní se podívejme na kód této aplikace. Podívejme se na úplný kód pro tento příklad:

#include
#include

prázdnota hlavní ( )
{
int sekundy = 0 ;
zatímco ( 1 )
{
printf ( 'Uplynulý čas: %i \n ' , sekundy ) ;
sekundy += 2 ;
spát ( 2 ) ;
}

}

Dále uvidíme obrázek s kompilací a provedením tohoto kódu. Jak vidíme, každé 2 sekundy program vypíše na obrazovku uplynulé sekundy od provedení procesu.

Vliv signálů na funkci Sleep().

V tomto příkladu chceme sledovat vliv signálů na proces, který je uspán pomocí funkce sleep(). K tomu vytvoříme jednoduchou aplikaci, která se skládá z funkce main() a handleru pro signál 36.

Na prvním řádku funkce main() deklarujeme zbývající proměnnou typu int, kam uložíme hodnotu, kterou vrací funkce sleep(). Poté použijeme funkci signal() k navázání handleru na signál 36. Na dalším řádku zobrazíme PID procesu, který pak použijeme k odeslání signálu z druhého shellu do procesu. Nakonec zavoláme funkci sleep() a nastavíme její vstupní argument na 60 sekund, což je dostatečně dlouhá doba na odeslání signálu z druhého shellu. Zbývající proměnnou odešleme jako výstupní argument funkci sleep().

Obslužná rutina, která je připojena k signálu 36, se skládá z řádku kódu, kde funkce printf() vytiskne zprávu „Zbývající čas:“ následovanou hodnotou, kterou vrátí funkce sleep() v době, kdy signál dorazí do procesu. Zde se podívejme na kód pro tento příklad.

#include
#include
#include
#include

prázdnota psovod ( int zbývající ) ;

prázdnota hlavní ( )
{
int zbývající ;
signál ( 36 , psovod ) ;
printf ( 'ID procesu: %i \n ' , vztekat se ( ) ) ;
zbývající = spát ( 60 ) ;
}

prázdnota psovod ( int zbývající )

{
printf ( 'Zbývající čas: %i \n ' , zbývající ) ;
}

Následující obrázek, který vidíme, ukazuje kompilaci a spuštění tohoto kódu:

Abychom viděli účinek signálů v tomto procesu, zkompilujeme tento kód a spustíme jej. Poté z druhého terminálu vyšleme signál s následující syntaxí:

zabít - n signál PID

Následující obrázek, který vidíme, ukazuje provádění kódu v předchozí konzoli a účinky příchodu signálu, který je odeslán z následující konzoly. Jak můžete vidět, signál potlačil účinek funkce sleep() probuzením procesu:

Závěr

V tomto článku Linuxhint jsme vám ukázali, jak použít funkci sleep() k uspání procesu na určený počet sekund. Také jsme vám ukázali syntaxi a také popis funkce a metody volání.

Na praktických příkladech, úryvcích kódu a obrázků jsme vám pomocí funkce sleep() ukázali, jak proces uspat a co ovlivňuje příchod signálu na spící proces.