Sleep()-funktio C-kielellä

Sleep Funktio C Kielella



Kun kehitämme ohjelmia, jotka vaativat käyttäjän vuorovaikutusta, on tapauksia, joissa on tarpeen säätää järjestelmäaikoja niin, että sovellus on luettava ja helppokäyttöinen.

Jos esimerkiksi kehitämme konsolisovellusta, jossa meidän on ilmoitettava käyttäjälle peräkkäin suoritettavat tehtävät, tietoviestien tulee säilyä kohtuullisen ajan, jotta käyttäjä ehtii lukea ne ennen kuin ne tyhjennetään ja ohjelma siirtyy seuraavaan komentoon.

Tässä Linuxhint-artikkelissa opit käyttämään sleep()-funktiota viiveiden luomiseen reaaliajassa. Näytämme sinulle tämän toiminnon syntaksin ja kuvauksen sekä POSIXin tarjoamat vaihtoehdot luodaksesi viiveitä alle sekunnin murto-osilla. Käytännön esimerkkien, koodien ja kuvien avulla näytämme sinulle, kuinka viivyttää ohjelman suorittamista ja signaalien vaikutusta tähän toimintoon.








Sleep()-funktion syntaksi C-kielessä



allekirjoittamaton int nukkua ( allekirjoittamaton int sek )

Sleep()-funktion kuvaus C-kielellä

Sleep()-funktio asettaa prosessin tai säikeen lepotilaan sekunteina määritetyksi ajaksi 'sec'-syöttöargumentissa, joka on etumerkitön kokonaisluku. Kun sleep()-funktiota on kutsuttu, kutsuprosessi nukkuu, kunnes se aikakatkaisee tai vastaanottaa signaalin.



Tätä toimintoa käytetään usein pakottamaan pitkiä yli 1 sekunnin viiveitä reaaliaikaisten prosessien suorittamiseen. Alle 1 sekunnin viiveille POSIX tarjoaa mikrosekunnin resoluutiofunktion, usleep(), joka käyttää samaa menetelmäkutsua kuin sleep(). Alle 1 mikrosekunnin viiveille on olemassa myös nanosleep()-funktio, jonka resoluutio on 1 nanosekunti, mutta eri kutsumenetelmällä, jossa se käyttää 'timespec'-rakenteita syöteargumentteina viiveajan asettamiseen.





Jos sleep()-funktio on käyttänyt koko määritetyn ajan, se palauttaa tuloksena 0:n. Jos suoritus keskeytyy signaalin saapuessa ennen kuin määritetty aika on kulunut, se palauttaa jäljellä olevat sekuntimäärät siihen aikaan.

Sleep()-funktio määritellään 'unistd.h'-otsikossa. Käyttääksemme sitä meidän on sisällytettävä tämä tiedosto koodiin seuraavasti:



#include

Kuinka lisätä viiveitä prosessiin Sleep()-funktiolla

Tässä esimerkissä luomme ajastimen, joka koostuu äärettömästä silmukasta, jossa tulostetaan 'Kulunut aika' -viesti komentokonsoliin ja sen jälkeen prosessin kuluneet sekunnit. Jokainen näistä silmukoista toistetaan 2 sekunnin välein sleep()-funktion aiheuttaman viiveen vuoksi.

Tätä varten otamme tyhjän tiedoston '.c'-tunnisteella ja lisäämme siihen otsikot 'stdio.h' ja 'unistd.h'. Sitten avaamme tyhjän main()-funktion ja määritämme siihen int-tyypin muuttujasekunnit, joita käytämme kuluneen ajan laskurina.

Kun otsikot on lisätty ja muuttuja ilmoitettu, avaamme äärettömän silmukan ja käytämme siinä printf()-funktiota viestin ja aika-arvon näyttämiseen. Seuraavalla rivillä lisäämme aikamuuttujaa 2:lla ja kutsumme sitten sleep()-funktiota, jonka arvo on 2 syöteargumenttina. Tällä tavalla tämä sykli toistuu joka sekunti ja saamme laskurin, joka näyttää kuluneen ajan näytöllä. Katsotaanpa nyt tämän sovelluksen koodia. Katsotaanpa tämän esimerkin täydellinen koodi:

#include
#include

mitätön pää ( )
{
int sekuntia = 0 ;
sillä aikaa ( 1 )
{
printf ( Kulunut aika: %i \n ' , sekuntia ) ;
sekuntia += 2 ;
nukkua ( 2 ) ;
}

}

Seuraavassa näemme kuvan tämän koodin kokoamisesta ja suorittamisesta. Kuten näemme, joka 2. sekunti, ohjelma tulostaa näytölle kuluneet sekunnit prosessin suorittamisesta.

Signaalien vaikutus Sleep()-funktioon

Tässä esimerkissä haluamme tarkkailla signaalien vaikutusta prosessiin, joka laitetaan nukkumaan sleep()-funktiolla. Tätä varten luomme yksinkertaisen sovelluksen, joka koostuu main()-funktiosta ja signaalin 36 käsittelijästä.

Main()-funktion ensimmäisellä rivillä ilmoitamme jäljellä olevan int-tyypin muuttujan, johon tallennamme sleep()-funktion palauttaman arvon. Sitten käytämme signaali()-funktiota käsittelijän sitomiseen signaaliin 36. Seuraavalla rivillä näytämme prosessin PID:n, jota käytämme sitten signaalin lähettämiseen toisesta kuoresta prosessiin. Lopuksi kutsumme sleep()-funktiota ja asetamme sen syöttöargumentiksi 60 sekuntia, joka on tarpeeksi pitkä signaalin lähettämiseen toisesta kuoresta. Lähetämme jäljellä olevan muuttujan lähtöargumenttina nukkumaan ().

Käsittelijä, joka on liitetty signaaliin 36, koostuu koodirivistä, jossa printf()-funktio tulostaa 'Jäljellä oleva aika:' -viestin ja sen jälkeen arvon, jonka sleep() palauttaa signaalin saapuessa prosessiin. Katsotaanpa tässä tämän esimerkin koodia.

#include
#include
#include
#include

mitätön käsittelijä ( int jäljelle jäänyt ) ;

mitätön pää ( )
{
int jäljelle jäänyt ;
signaali ( 36 , käsittelijä ) ;
printf ( 'Prosessin tunnus: %i \n ' , saadapid ( ) ) ;
jäljelle jäänyt = nukkua ( 60 ) ;
}

mitätön käsittelijä ( int jäljelle jäänyt )

{
printf ( 'Jäljellä oleva aika: %i \n ' , jäljelle jäänyt ) ;
}

Seuraava kuva, jonka näemme, näyttää tämän koodin kokoamisen ja suorittamisen:

Nähdäksemme signaalien vaikutuksen tässä prosessissa kokoamme tämän koodin ja suoritamme sen. Sitten lähetämme toisesta päätteestä signaalin seuraavalla syntaksilla:

tappaa - n signaalin PID

Seuraava kuva, jonka näemme, näyttää koodin suorittamisen edellisessä konsolissa ja vaikutukset signaalin saapumisesta, joka lähetetään seuraavasta konsolista. Kuten näet, signaali on tukahduttanut sleep()-funktion vaikutuksen herättämällä prosessin:

Johtopäätös

Tässä Linuxhint-artikkelissa näytimme sinulle, kuinka voit käyttää sleep()-funktiota prosessin asettamiseen nukkumaan tietyn sekuntimäärän ajaksi. Näimme sinulle myös syntaksin sekä funktion ja kutsutavan kuvauksen.

Käytännön esimerkkien, koodinpätkien ja kuvien avulla osoitimme, kuinka prosessi laitetaan nukkumaan ja mikä vaikuttaa signaalin saapumiseen nukkumisprosessiin sleep()-funktion avulla.