Hvordan bruke sigalrm og alarmfunksjon på C -språk?

Hvordan bruke sigalrm og alarmfunksjon på C -språk?
De alarm() funksjon brukes til å generere en Sigalrm signal etter en spesifisert mengde tid som er gått. I denne artikkelen skal vi vise deg hvordan du bruker alarm() funksjon og Sigalrm Signal i Linux. Så la oss komme i gang.

Syntaks

usignert INT -alarm (usignerte INT -sekunder)

Funksjonen er definert i Unistd.h headerfil.

Argumenter

Funksjonen tar ett argument, sekunder. Etter sekunder sekunder har gått siden alarm() funksjon, Sigalrm signalet genereres. Standard oppførsel ved mottak av Sigalrm er å avslutte prosessen. Men vi kan fange og håndtere signalet. Se signalbehandlingsdetaljer.

De alarm() Funksjonen vil returnere en ikke -null verdi, hvis en annen alarm tidligere har blitt satt og verdien er antall sekunder som er igjen for den forrige planlagte alarmen på grunn av levert. Ellers alarm() vil returnere null.

Eksempel1.c:

#inkludere
#inkludere
#inkludere
void sig_handler (int signum)
printf ("Inside Handler Function \ n");

int main ()
signal (sigalrm, sig_handler); // Registrer signalbehandler
alarm (2); // Planlagt alarm etter 2 sekunder
for (int i = 1 ;; i ++)
printf ("%d: Inne hovedfunksjon \ n", i);
søvn (1); // forsinkelse i 1 sekund

retur 0;

I skjermbildet av utgangen fra Eksempel1.c, Programmet kjøres ved hjelp av Time Command, slik at vi kan få en oversikt over utførelsestiden for programmet. Vi observerte at vi i hovedfunksjonen kaller alarm() funksjon, planlagt i 2 sekunder. Så for Loop utføres, kalles Sig_handler -funksjonen etter 2 sekunder og utførelsen av hovedfunksjonen blir satt på pause. Etter utførelse av SIG_Handler -funksjonen blir i hovedfunksjon for utførelse av sløyfe gjenopptatt. Her bruker vi søvnfunksjon for forsinkelse slik at vi kan forstå strømmen av utførelsen. For -loopen er en uendelig sløyfe, når vi trykker på en avbruddsnøkkel (CTRL+C), vil utførelsen stoppe.

Generere Sigalrm ved hjelp av signal() Funksjon kan ikke stables. Bare en Sigalrm Generasjon kan planlegges. Påfølgende samtaler om signal() Funksjon Tilbakestill vekkerklokken til anropsprosessen.

Eksempel2.c:

#inkludere
#inkludere
#inkludere
void sig_handler (int signum)
printf ("Inside Handler Function \ n");

int main ()
signal (sigalrm, sig_handler); // Registrer signalbehandler
alarm (4); // Planlagt alarm etter 4 sekunder
alarm (1); // Planlagt alarm etter 1 sekunder
for (int i = 1 ;; i ++)
printf ("%d: Inne hovedfunksjon \ n", i);
søvn (1); // forsinkelse i 1 sekund

retur 0;

I skjermbildet av utgangen fra Eksempel2.c, Vi kan se at programmet utførte mer enn 7 sekunder, men den første alarmen som var planlagt etter 4 sekunder, ringer ikke behandlerfunksjonen. Den andre alarmen som var planlagt etter 1 sekund er tilbakestilt alarmen.

Hvis verdien av argumentet er null, blir enhver tidligere anmodning om alarmbestillelse kansellert.

Eksempel3.c:

#inkludere
#inkludere
#inkludere
void sig_handler (int signum)
printf ("Inside Handler Function \ n");

int main ()
signal (sigalrm, sig_handler); // Registrer signalbehandler
alarm (2); // Planlagt alarm etter 2 sekunder
alarm (0); // kansellerte den forrige alarmen
for (int i = 1 ;; i ++)
printf ("%d: Inne hovedfunksjon \ n", i);
søvn (1); // forsinkelse i 1 sekund

retur 0;

I skjermbildet av utgangen fra Eksempel3.c, Vi kan se at den første alarmen som var planlagt etter at 2 sekunder er kansellert på grunn av den andre alarmen i 0 sekund.

I Eksempel4.c Vi får se hvor kontinuerlig vi kan sette en alarm for hvert 2. sekund.

Eksempel4.c:

#inkludere
#inkludere
#inkludere
void sig_handler (int signum)
printf ("Inside Handler Function \ n");
alarm (2); // Planlegg en ny alarm etter 2 sekunder

int main ()
signal (sigalrm, sig_handler); // Registrer signalbehandler
alarm (2); // Planlegg den første alarmen etter 2 sekunder
for (int i = 1 ;; i ++)
printf ("%d: Inne hovedfunksjon \ n", i);
pause(); // venter til signalet blir håndtert

retur 0;

I skjermbildet av utgangen fra Eksempel4.c, Vi kan se at alarmen er kontinuerlig i hvert 2. sekund. Vi tilbakestiller alarmen i Sig_Handler -funksjonen.

I Eksempel5.c Vi får se hvordan vi kan utsette alarmen som allerede er planlagt. Vi vil bruke Sigint -signal for avbrytelse. Når brukertype Ctrl+C i tastaturet, Sigint signalet vil generere.

Eksempel5.c:

#inkludere
#inkludere
#inkludere
void sig_handler (int signum)
if (signum == sigalrm) // signalbehandler for sigalrm
printf ("Inside Handler -funksjonen for sigalrm \ n");
alarm (2);

if (signum == sigint) // signalbehandler for Sigint
printf ("\ nsnoozing i 5 sekunder ... \ n");
alarm (5);


int main ()
signal (sigalrm, sig_handler); // Registrer signalbehandler for Sigalrm
signal (sigint, sig_handler); // Registrer signalbehandler for Sigint
alarm (2); // Planlegg den første alarmen etter 2 sekunder
for (int i = 1 ;; i ++)
printf ("%d: Inne hovedfunksjon \ n", i);
pause(); // venter til signalet blir håndtert

retur 0;

I skjermbildet av utgangen fra Eksempel5.c, Vi kan se at når brukertype Ctrl+C, tilbakestilles alarmen 5 sekunder. I dette programmet har vi bare brukt en behandlerfunksjon for to forskjellige signaler, men i behandlerfunksjonen har det blitt sjekket at for hvilket signal førerfunksjonen blir kalt.

Konklusjon:

Så vi har sett at hvordan alarmfunksjonen kan settes for utløsende signal, hvordan du tilbakestiller alarm, hvordan du kansellerer allerede planlagt alarm.