Функција Слееп() у језику Ц

Funkcija Sleep U Jeziku C



Када развијамо програме који захтевају интеракцију корисника, постоје случајеви када је потребно прилагодити системска времена како би апликација била читљива и лака за коришћење.

На пример, ако развијамо конзолну апликацију у којој треба да обавестимо корисника о задацима који ће се извршавати у низу, информативне поруке би требало да трају разумно време како би корисник имао времена да их прочита пре него што буду избрисани и програм прелази на следећу команду.

У овом чланку о Линукхинт-у научићете како да користите функцију слееп() за креирање кашњења у реалном времену. Показаћемо вам синтаксу и опис ове функције, као и опције које ПОСИКС пружа за стварање кашњења са делићима мањим од секунде. Затим, користећи практичне примере, кодове и слике, показаћемо вам како да одложите извршење програма и ефекте сигнала на ову функцију.








Синтакса функције Слееп() у језику Ц



непотписан инт спавати ( непотписан инт сец )

Опис функције Слееп() у језику Ц

Функција слееп() ставља процес или нит у стање мировања на време у секундама које је наведено у улазном аргументу „сец“ који је цео број без предзнака. Једном када се позове функција слееп(), процес позива спава док не истекне време или не прими сигнал.



Ова функција се често користи за спровођење дугих кашњења дужих од 1 секунде у извршавању процеса у реалном времену. За кашњења мања од 1 секунде, ПОСИКС обезбеђује функцију резолуције микросекунде, услееп(), која користи исти позив методе као и слееп(). За кашњења мања од 1 микросекунде, постоји и функција нанослееп() са резолуцијом од 1 наносекунде, али са другачијим методом позива где користи „тимеспец“ структуре као улазне аргументе за подешавање времена кашњења.





Ако је функција слееп() потрошила све наведено време, враћа 0 као резултат. Ако је извршење прекинуто доласком сигнала пре истека одређеног времена, враћа се преостали број секунди до тог времена.

Функција слееп() је дефинисана у заглављу “унистд.х”. Да бисмо га користили, морамо да укључимо ову датотеку у код на следећи начин:



#инцлуде <унистд.х>

Како увести кашњења у процес са функцијом Слееп().

У овом примеру креирамо тајмер који се састоји од бесконачне петље у којој штампамо поруку „Протекло време“ у командној конзоли, након чега следе протекле секунде процеса. Свака од ових петљи се понавља сваке 2 секунде због кашњења узрокованог функцијом слееп().

Да бисмо то урадили, узимамо празну датотеку са екстензијом „.ц“ и додајемо у њу заглавља „стдио.х“ и „унистд.х“. Затим отварамо празну маин() функцију и у њој дефинишемо променљиве секунде типа инт које ћемо користити као бројач за протекло време.

Када се заглавља уметну и променљива декларишемо, отварамо бесконачну петљу и користимо функцију принтф() у њој да прикажемо поруку и временску вредност. У следећем реду повећавамо временску променљиву за 2, а затим позивамо функцију слееп() са вредношћу 2 као улазним аргументом. На овај начин се овај циклус понавља сваке секунде и добијамо бројач који на екрану приказује протекло време. Сада, хајде да погледамо код за ову апликацију. Погледајмо комплетан код за овај пример:

#инцлуде <стдио.х>
#инцлуде <унистд.х>

празнина главни ( )
{
инт секунди = 0 ;
док ( 1 )
{
принтф ( „Протекло време: %и ' , секунди ) ;
секунди += 2 ;
спавати ( 2 ) ;
}

}

У наставку ћемо видети слику са компилацијом и извршавањем овог кода. Као што видимо, сваке 2 секунде програм исписује на екран секунде које су прошле од извршења процеса.

Утицај сигнала на функцију спавања().

У овом примеру желимо да посматрамо ефекат сигнала на процес који се ставља у стање мировања помоћу функције слееп(). Да бисмо то урадили, креирамо једноставну апликацију која се састоји од функције маин() и руковаоца за сигнал 36.

У првом реду функције маин() декларишемо преосталу променљиву типа инт где чувамо вредност коју враћа функција слееп(). Затим користимо функцију сигнал() да повежемо руковалац са сигналом 36. У следећем реду приказујемо ПИД процеса који затим користимо да пошаљемо сигнал из друге љуске у процес. Коначно, позивамо функцију слееп() и постављамо њен улазни аргумент на 60 секунди, довољно дуго да пошаљемо сигнал из друге љуске. Преосталу променљиву шаљемо као излазни аргумент у слееп().

Руковалац који је везан за сигнал 36 састоји се од линије кода у којој функција принтф() штампа поруку „Преостало време:“ праћену вредношћу коју враћа слееп() у време када сигнал стигне у процес. Ево, погледајмо код за овај пример.

#инцлуде <стдио.х>
#инцлуде <унистд.х>
#инцлуде <стдлиб.х>
#инцлуде <сигнал.х>

празнина руковалац ( инт преосталих ) ;

празнина главни ( )
{
инт преосталих ;
сигнал ( 36 , руковалац ) ;
принтф ( „ИД процеса: %и ' , гетпид ( ) ) ;
преосталих = спавати ( 60 ) ;
}

празнина руковалац ( инт преосталих )

{
принтф ( „Преостало време: %и ' , преосталих ) ;
}

Следећа слика коју видимо приказује компилацију и извршење овог кода:

Да бисмо видели ефекат сигнала у овом процесу, компајлирамо овај код и покренемо га. Затим, са другог терминала, шаљемо сигнал са следећом синтаксом:

убити - н сигнал ПИД

Следећа слика коју видимо приказује извршавање кода у претходној конзоли и ефекте доласка сигнала који се шаље са следеће конзоле. Као што видите, сигнал је потиснуо ефекат функције слееп() тако што је покренуо процес:

Закључак

У овом чланку о Линукхинт-у, показали смо вам како да користите функцију слееп() да ставите процес у стање мировања на одређени број секунди. Такође смо вам показали синтаксу као и опис функције и методе позивања.

Користећи практичне примере, исечке кода и слике, показали смо вам како да успавате процес и шта утиче на долазак сигнала на процес спавања помоћу функције слееп().