C Programmering

Sådan bruges SIGALRM og alarmfunktion på C-sprog?

Sådan bruges SIGALRM og alarmfunktion på C-sprog?
Det alarm () funktion bruges til at generere en SIGALRM signal efter en specificeret tidsforløb. I denne artikel vil vi vise dig, hvordan du bruger alarm () funktion og SIGALRM signal i Linux. Så lad os komme i gang.

Syntaks

usigneret int alarm (usigneret int sekunder)

Funktionen er defineret i unistd.h header-fil.

Argumenter

Funktionen tager et argument, sekunder. Efter sekunder sekunder er gået siden anmodning om alarm() funktion, den SIGALRM signalet genereres. Standardadfærden ved modtagelse af SIGALRM er at afslutte processen. Men vi kan fange og håndtere signalet. Se oplysninger om signalhåndtering.

Det alarm () funktionen returnerer en værdi, der ikke er nul, hvis en anden alarm tidligere er indstillet, og værdien er antallet af resterende sekunder for den tidligere planlagte alarm på grund af leveret. Ellers alarm () returnerer nul.

Eksempel 1.c:

#omfatte
#omfatte
#omfatte
 
ugyldig sig_handler (int signum)
 
printf ("Inside handler-funktion \ n");

 
int main ()
 
signal (SIGALRM, sig_handler); // Registrer signalhåndterer
 
alarm (2); // Planlagt alarm efter 2 sekunder
 
for (int i = 1 ;; i ++)
 
printf ("% d: Inde i hovedfunktionen \ n", i);
søvn (1); // Forsink i 1 sekund

returnere 0;

På skærmbilledet af output af Eksempel 1.c, programmet køres ved hjælp af tidskommando, så vi kan få et overblik over programmets udførelsestid. Vi observerede, at vi i hovedfunktion kalder alarm () funktion, planlagt til 2 sekunder. Så for loop udføres, efter 2 sekunder kaldes sig_handler-funktion, og udførelsen af ​​hovedfunktionen er sat på pause. Efter udførelse af sig_handler-funktion genoptages hovedfunktionen til loopudførelse. Her bruger vi søvnfunktion til forsinkelse, så vi kan forstå strømmen af ​​udførelsen. For-sløjfen er en uendelig sløjfe, når vi trykker på en afbrydelsestast (Ctrl + C), stopper udførelsen.

Genererer SIGALRM ved brug af signal() funktionen kan ikke stables. Kun en SIGALRM generation kan planlægges. Efterfølgende opkald fra signal() funktion nulstiller alarmuret i opkaldsprocessen.

Eksempel 2.c:

#omfatte
#omfatte
#omfatte
 
ugyldig sig_handler (int signum)
 
printf ("Inside handler-funktion \ n");

 
int main ()
 
signal (SIGALRM, sig_handler); // Registrer signalhåndterer
 
alarm (4); // Planlagt alarm efter 4 sekunder
alarm (1); // Planlagt alarm efter 1 sekund
 
for (int i = 1 ;; i ++)
 
printf ("% d: Inde i hovedfunktionen \ n", i);
søvn (1); // Forsink i 1 sekund

 
returnere 0;

På skærmbilledet af output af Eksempel 2.c, vi kan se, at programmet blev udført mere end 7 sekunder, men den første alarm, der var planlagt efter 4 sekunder, kalder ikke behandlerfunktionen. Den anden alarm, der var planlagt efter 1 sekund, nulstilles alarmen.

Hvis værdien af ​​argumentets sekunder er nul, annulleres enhver tidligere foretaget alarmanmodning.

Eksempel 3.c:

#omfatte
#omfatte
#omfatte
 
ugyldig sig_handler (int signum)
 
printf ("Inside handler-funktion \ n");

 
int main ()
 
signal (SIGALRM, sig_handler); // Registrer signalhåndterer
 
alarm (2); // Planlagt alarm efter 2 sekunder
alarm (0); // Annullerede den forrige alarm
 
for (int i = 1 ;; i ++)
 
printf ("% d: Inde i hovedfunktionen \ n", i);
søvn (1); // Forsink i 1 sekund

 
returnere 0;

På skærmbilledet af output af Eksempel 3.c, vi kan se, at den første alarm, der var planlagt efter 2 sekunder, annulleres på grund af den anden alarm i 0 sekund.

I Eksempel 4.c vi vil se, hvor kontinuerligt vi kan indstille en alarm i hvert 2. sekund.

Eksempel 4.c:

#omfatte
#omfatte
#omfatte
 
ugyldig sig_handler (int signum)
 
printf ("Inside handler-funktion \ n");
 
alarm (2); // Planlæg en ny alarm efter 2 sekunder

 
int main ()
 
signal (SIGALRM, sig_handler); // Registrer signalhåndterer
 
alarm (2); // Planlæg den første alarm efter 2 sekunder
 
for (int i = 1 ;; i ++)
 
printf ("% d: Inde i hovedfunktionen \ n", i);
pause(); // venter på, at signalet håndteres

 
returnere 0;

På skærmbilledet af output af Eksempel 4.c, vi kan se, at alarmen er kontinuerlig hvert 2. sekund. Vi nulstiller alarmen i sig_handler-funktionen.

I Eksempel 5.c vi vil se, hvordan vi kan forsinke den allerede planlagte alarm. Vi bruger SIGINT-signal til afbrydelse. Når brugeren skriver Ctrl + C på tastaturet, SIGINT signalet genereres.

Eksempel 5.c:

#omfatte
#omfatte
#omfatte
 
ugyldig sig_handler (int signum)
 
hvis (signum == SIGALRM) // signalhåndtering til SIGALRM
 
printf ("Indehåndteringsfunktion til SIGALRM \ n");
alarm (2);

hvis (signum == SIGINT) // signalhåndtering til SIGINT
printf ("\ nSlukker i 5 sekunder ... \ n");
alarm (5);

 

 
int main ()
 
signal (SIGALRM, sig_handler); // Registrer signalhåndterer til SIGALRM
signal (SIGINT, sig_handler); // Registrer signalhåndterer for SIGINT
 
alarm (2); // Planlæg den første alarm efter 2 sekunder
 
for (int i = 1 ;; i ++)
 
printf ("% d: Inde i hovedfunktionen \ n", i);
pause(); // venter på, at signalet håndteres

 
returnere 0;

På skærmbilledet af output af Eksempel 5.c, vi kan se, at når brugertype Ctrl + C nulstilles alarmen 5 sekunder. I dette program har vi kun brugt en behandlingsfunktion til to forskellige signaler, men i behandlingsfunktionen er det kontrolleret, for hvilket signal handlingsfunktionen kaldes.

Konklusion:

Så vi har set, hvordan alarmfunktion kan indstilles til at udløse signal, hvordan man nulstiller alarm, hvordan man annullerer allerede planlagt alarm.

Sådan bruges GameConqueror Cheat Engine i Linux
Artiklen dækker en vejledning om brug af GameConqueror-snydemotoren i Linux. Mange brugere, der spiller spil på Windows, bruger ofte "Cheat Engine" -a...
Bedste spilkonsolemulatorer til Linux
Denne artikel viser en liste over populære spilkonsolemuleringssoftware, der er tilgængelig til Linux. Emulation er et softwarekompatibilitetslag, der...
Bedste Linux Distros til spil i 2021
Linux-operativsystemet er kommet langt fra dets originale, enkle, serverbaserede udseende. Dette operativsystem er forbedret enormt i de senere år og ...