Sleep()-funksjon i C Language

Sleep Funksjon I C Language



Når vi utvikler programmer som krever en brukerinteraksjon, er det tilfeller hvor det er nødvendig å justere systemtidene slik at applikasjonen er lesbar og enkel å bruke.

Hvis vi for eksempel utvikler en konsollapplikasjon der vi må informere brukeren om oppgavene som skal utføres i rekkefølge, bør informasjonsmeldingene vedvare i rimelig tid slik at brukeren har tid til å lese dem før de slettes og programmet går videre til neste kommando.

I denne Linuxhint-artikkelen lærer du hvordan du bruker sleep()-funksjonen for å skape forsinkelser i sanntid. Vi viser deg syntaksen og beskrivelsen av denne funksjonen, samt alternativene som POSIX gir for å skape forsinkelser med brøkdeler på mindre enn et sekund. Deretter, ved hjelp av praktiske eksempler, koder og bilder, viser vi deg hvordan du forsinker kjøringen av et program og effekten av signaler på denne funksjonen.








Syntaks for Sleep()-funksjonen i C Language



usignert int sove ( usignert int sek )

Beskrivelse av Sleep()-funksjonen i C Language

Sleep()-funksjonen setter prosessen eller tråden i dvale for tiden i sekunder som er spesifisert i 'sek'-inndataargumentet som er et heltall uten fortegn. Når sleep()-funksjonen er kalt, hviler anropsprosessen til den blir tidsavbrutt eller mottar et signal.



Denne funksjonen brukes ofte til å håndheve lange forsinkelser på mer enn 1 sekund i utførelsen av sanntidsprosesser. For forsinkelser på mindre enn 1 sekund gir POSIX mikrosekundoppløsningsfunksjonen, usleep(), som bruker samme metodekall som sleep(). For forsinkelser på mindre enn 1 mikrosekund er det også nanosleep()-funksjonen med en oppløsning på 1 nanosekund, men med en annen kallemetode der den bruker 'timespec'-strukturene som input-argumenter for å angi forsinkelsestiden.





Hvis sleep()-funksjonen har brukt hele den angitte tiden, returnerer den 0 som resultat. Hvis utførelsen avbrytes ved ankomst av et signal før den angitte tiden har gått, returnerer den det gjenværende antall sekunder til det tidspunktet.

Sleep()-funksjonen er definert i 'unistd.h'-overskriften. For å bruke den må vi inkludere denne filen i koden som følger:



#include

Hvordan introdusere forsinkelser i en prosess med Sleep()-funksjonen

I dette eksemplet lager vi en tidtaker som består av en uendelig sløyfe der vi skriver ut 'Forløpt tid'-meldingen i kommandokonsollen, etterfulgt av de forløpte sekundene av prosessen. Hver av disse løkkene gjentas hvert 2. sekund på grunn av forsinkelsen som er forårsaket av sleep()-funksjonen.

For å gjøre dette tar vi en tom fil med filtypen '.c' og legger til 'stdio.h' og 'unistd.h' overskriftene i den. Deretter åpner vi en tom hoved()-funksjon og definerer variabelen sekunder av typen int i den som vi skal bruke som teller for medgått tid.

Når overskriftene er satt inn og variabelen er deklarert, åpner vi en uendelig løkke og bruker printf()-funksjonen i den for å vise meldingen og tidsverdien. På neste linje øker vi tidsvariabelen med 2 og kaller deretter sleep()-funksjonen med verdien 2 som input-argument. På denne måten gjentas denne syklusen hvert sekund og vi får en teller som viser medgått tid på skjermen. La oss nå ta en titt på koden for denne applikasjonen. La oss se den komplette koden for dette eksemplet:

#include
#include

tomrom hoved- ( )
{
int sekunder = 0 ;
samtidig som ( 1 )
{
printf ( 'Forløpt tid: %i \n ' , sekunder ) ;
sekunder += 2 ;
sove ( 2 ) ;
}

}

I det følgende vil vi se et bilde med kompilering og utførelse av denne koden. Som vi kan se, skriver programmet hvert 2. sekund ut de forløpte sekundene på skjermen siden utførelsen av prosessen.

Effekt av signaler på Sleep()-funksjonen

I dette eksemplet ønsker vi å observere effekten av signaler på en prosess som settes i dvale ved hjelp av sleep()-funksjonen. For å gjøre dette lager vi en enkel applikasjon som består av en hoved()-funksjon og en behandler for signal 36.

I den første linjen i main()-funksjonen deklarerer vi den gjenværende variabelen av typen int der vi lagrer verdien som returneres av sleep()-funksjonen. Deretter bruker vi signal()-funksjonen for å binde behandleren til signal 36. På neste linje viser vi PID-en til prosessen som vi deretter bruker til å sende et signal fra et andre skall til prosessen. Til slutt kaller vi sleep()-funksjonen og setter input-argumentet til 60 sekunder, lenge nok til å sende et signal fra et andre skall. Vi sender den gjenværende variabelen som utgangsargument til sleep().

Behandleren som er knyttet til signal 36 består av en kodelinje der printf()-funksjonen skriver ut 'Gjenstående tid:'-meldingen etterfulgt av verdien som returneres av sleep() på det tidspunktet signalet ankommer prosessen. Her, la oss se på koden for dette eksemplet.

#include
#include
#include
#include

tomrom handler ( int gjenstående ) ;

tomrom hoved- ( )
{
int gjenstående ;
signal ( 36 , handler ) ;
printf ( 'Prosess-ID: %i \n ' , bli sur ( ) ) ;
gjenstående = sove ( 60 ) ;
}

tomrom handler ( int gjenstående )

{
printf ( 'Gjenstående tid: %i \n ' , gjenstående ) ;
}

Følgende bilde som vi ser viser kompileringen og utførelsen av denne koden:

For å se effekten av signalene i denne prosessen, kompilerer vi denne koden og kjører den. Så, fra en andre terminal, sender vi et signal med følgende syntaks:

drepe - n signal PID

Følgende bilde som vi ser viser utførelsen av koden i forrige konsoll og effekten av ankomsten av et signal som sendes fra den følgende konsollen. Som du kan se, har signalet undertrykt effekten av sleep()-funksjonen ved å vekke prosessen:

Konklusjon

I denne Linuxhint-artikkelen viste vi deg hvordan du bruker sleep()-funksjonen til å sette en prosess i dvale i et spesifisert antall sekunder. Vi viste deg også syntaksen samt beskrivelsen av funksjonen og anropsmetoden.

Ved å bruke praktiske eksempler, kodebiter og bilder, viste vi deg hvordan du setter en prosess i dvale og hva som påvirker ankomsten av et signal har på en soveprosess ved å bruke sleep()-funksjonen.