C Programmering

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

Hvordan bruke SIGALRM og alarmfunksjon på C-språk?
De alarm() funksjonen brukes til å generere en SIGALRM signalet etter en spesifisert tid som har 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 (usignert int sekunder)

Funksjonen er definert i unistd.h topptekstfil.

Argumenter

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

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

Eksempel 1.c:

#inkludere
#inkludere
#inkludere
 
ugyldig 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 i hovedfunksjonen \ n", i);
søvn (1); // Forsink i 1 sekund

retur 0;

På skjermbildet av utdataene fra Eksempel 1.c, programmet kjøres ved hjelp av tidskommando, slik at vi kan få en oversikt over gjennomføringstiden for programmet. Vi observerte at i hovedfunksjon kaller vi alarm() funksjon, planlagt i 2 sekunder. Så for loop utføres, etter 2 sekunder kalles sig_handler-funksjon og utførelsen av hovedfunksjonen er satt på pause. Etter utførelse av sig_handler-funksjonen gjenopptas hovedfunksjonen for looputførelse. Her bruker vi søvnfunksjon for å forsinke slik at vi kan forstå flyten av utførelsen. For-sløyfen er en uendelig sløyfe, når vi trykker på en avbruddstast (Ctrl + C), vil utførelsen stoppe.

Genererer SIGALRM ved hjelp av signal() funksjonen kan ikke stables. Bare en SIGALRM generasjon kan planlegges. Suksessive samtaler av signal() funksjon tilbakestille vekkerklokken til anropsprosessen.

Eksempel 2.c:

#inkludere
#inkludere
#inkludere
 
ugyldig 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 sekund
 
for (int i = 1 ;; i ++)
 
printf ("% d: Inne i hovedfunksjonen \ n", i);
søvn (1); // Forsink i 1 sekund

 
retur 0;

I skjermbildet av utdataene fra Eksempel 2.c, vi kan se at programmet ble utført i 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, tilbakestiller alarmen.

Hvis verdien av argumentets sekunder er null, kanselleres alle tidligere utførte alarmanmodninger.

Eksempel 3.c:

#inkludere
#inkludere
#inkludere
 
ugyldig 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); // Avbrutt forrige alarm
 
for (int i = 1 ;; i ++)
 
printf ("% d: Inne i hovedfunksjonen \ n", i);
søvn (1); // Forsink i 1 sekund

 
retur 0;

I skjermbildet av utdataene fra Eksempel 3.c, vi kan se at den første alarmen som ble planlagt etter 2 sekunder er kansellert på grunn av den andre alarmen i 0 sekund.

I Eksempel 4.c vi vil se hvor kontinuerlig vi kan stille en alarm hvert 2. sekund.

Eksempel 4.c:

#inkludere
#inkludere
#inkludere
 
ugyldig 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 i hovedfunksjonen \ n", i);
pause(); // venter til signalet blir håndtert

 
retur 0;

På skjermbildet av utdataene fra Eksempel 4.c, vi kan se at alarmen er kontinuerlig hvert 2. sekund. Vi tilbakestiller alarmen i sig_handler-funksjonen.

I Eksempel 5.c vi vil se hvordan vi kan forsinke alarmen som allerede er planlagt. Vi bruker SIGINT-signal for avbrudd. Når brukeren skriver Ctrl + C på tastaturet, SIGINT signalet vil generere.

Eksempel 5.c:

#inkludere
#inkludere
#inkludere
 
ugyldig sig_handler (int signum)
 
if (signum == SIGALRM) // signalbehandler for SIGALRM
 
printf ("Inside handler function for SIGALRM \ n");
alarm (2);

if (signum == SIGINT) // signalbehandler for SIGINT
printf ("\ nSlukker 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 i hovedfunksjonen \ n", i);
pause(); // venter til signalet blir håndtert

 
retur 0;

I skjermbildet av utdataene fra Eksempel 5.c, vi kan se at når brukertypen Ctrl + C tilbakestilles alarmen 5 sekunder. I dette programmet har vi bare brukt en behandlerfunksjon for to forskjellige signaler, men i behandlerfunksjonen er det sjekket at for hvilket signal håndteringsfunksjonen blir kalt.

Konklusjon:

Så vi har sett at hvordan alarmfunksjonen kan stilles inn for å utløse signal, hvordan du tilbakestiller alarm, hvordan du avbryter allerede planlagt alarm.

Mus Kontroller og administrer musebevegelser mellom flere skjermer i Windows 10
Kontroller og administrer musebevegelser mellom flere skjermer i Windows 10
Dual Display Mouse Manager lar deg kontrollere og konfigurere musebevegelse mellom flere skjermer, ved å bremse bevegelsene nær grensen. Windows 10/8,...
Mus WinMouse lar deg tilpasse og forbedre musemarkørenes bevegelse på Windows PC
WinMouse lar deg tilpasse og forbedre musemarkørenes bevegelse på Windows PC
Hvis du vil forbedre standardfunksjonene til musepekeren, bruk freeware WinMouse. Det legger til flere funksjoner som hjelper deg å få mest mulig ut a...
Mus Mus venstreklikknapp fungerer ikke på Windows 10
Mus venstreklikknapp fungerer ikke på Windows 10
Hvis du bruker en dedikert mus med den bærbare eller stasjonære datamaskinen, men museklikk-knappen fungerer ikke på Windows 10/8/7 av en eller annen ...