C Programmering

Hur man använder SIGALRM och larmfunktion på C-språk?

Hur man använder SIGALRM och larmfunktion på C-språk?
De larm() funktionen används för att generera en SIGALRM signal efter en angiven tid. I den här artikeln ska vi visa dig hur du använder larm() funktion och SIGALRM signal i Linux. Så, låt oss komma igång.

Syntax

osignerat int larm (osignerat int sekunder)

Funktionen definieras i unistd.h rubrikfil.

Argument

Funktionen tar ett argument, sekunder. Efter sekunder sekunder har gått sedan begäran om larm() funktion, SIGALRM signal genereras. Standardbeteendet vid mottagandet av SIGALRM är att avsluta processen. Men vi kan fånga och hantera signalen. Se information om signalhantering.

De larm() -funktionen returnerar ett värde som inte är noll om ett annat larm har ställts in tidigare och värdet är antalet sekunder kvar för det föregående schemalagda larmet. Annat larm() returnerar noll.

Exempel 1.c:

#omfatta
#omfatta
#omfatta
 
ogiltig sig_handler (int signum)
 
printf ("Inside handler function \ n");

 
int main ()
 
signal (SIGALRM, sig_handler); // Registrera signalhanteraren
 
larm (2); // Schemalagt larm efter 2 sekunder
 
för (int i = 1 ;; i ++)
 
printf ("% d: Inne i huvudfunktionen \ n", i);
sömn (1); // Fördröj i 1 sekund

returnera 0;

I skärmdumpen av utdata från Exempel 1.c, programmet körs med hjälp av tidskommandot, så att vi kan få en överblick över körningstiden för programmet. Vi observerade att i huvudfunktionen kallar vi larm() funktion, schemalagd i 2 sekunder. Så, för loop körs, efter 2 sekunder kallas sig_handler-funktionen och körningen av huvudfunktionen är pausad. Efter körning av sig_handler-funktionen återupptas huvudfunktionen för loopkörning. Här använder vi sömnfunktionen för att fördröja så att vi kan förstå körningen av körningen. For-loop är en oändlig loop, när vi trycker på en avbrytningsknapp (Ctrl + C) kommer körningen att stoppa.

Alstrande SIGALRM använder sig av signal() funktionen kan inte staplas. Bara en SIGALRM generation kan planeras. Efterföljande samtal från signal() funktionen återställ alarmklockan för samtalsprocessen.

Exempel 2.c:

#omfatta
#omfatta
#omfatta
 
ogiltig sig_handler (int signum)
 
printf ("Inside handler function \ n");

 
int main ()
 
signal (SIGALRM, sig_handler); // Registrera signalhanteraren
 
larm (4); // Schemalagt larm efter 4 sekunder
larm (1); // Schemalagt larm efter 1 sekund
 
för (int i = 1 ;; i ++)
 
printf ("% d: Inne i huvudfunktionen \ n", i);
sömn (1); // Fördröj i 1 sekund

 
returnera 0;

I skärmdumpen av utdata från Exempel 2.c, vi kan se att programmet kördes mer än 7 sekunder men det första larmet som planerades efter 4 sekunder ringer inte till hanterarfunktionen. Det andra larmet som planerades efter 1 sekund återställer larmet.

Om värdet på argumentets sekunder är noll, annulleras alla tidigare gjorda larmförfrågningar.

Exempel 3.c:

#omfatta
#omfatta
#omfatta
 
ogiltig sig_handler (int signum)
 
printf ("Inside handler function \ n");

 
int main ()
 
signal (SIGALRM, sig_handler); // Registrera signalhanteraren
 
larm (2); // Schemalagt larm efter 2 sekunder
larm (0); // Avbrutit föregående larm
 
för (int i = 1 ;; i ++)
 
printf ("% d: Inne i huvudfunktionen \ n", i);
sömn (1); // Fördröj i 1 sekund

 
returnera 0;

I skärmdumpen av utdata från Exempel 3.c, vi kan se att det första larmet som planerades efter 2 sekunder avbryts på grund av det andra larmet i 0 sekund.

I Exempel 4.c vi kommer att se hur kontinuerligt vi kan ställa in ett larm varannan sekund.

Exempel 4.c:

#omfatta
#omfatta
#omfatta
 
ogiltig sig_handler (int signum)
 
printf ("Inside handler function \ n");
 
larm (2); // Planera ett nytt larm efter 2 sekunder

 
int main ()
 
signal (SIGALRM, sig_handler); // Registrera signalhanteraren
 
larm (2); // Schemalägg det första larmet efter 2 sekunder
 
för (int i = 1 ;; i ++)
 
printf ("% d: Inne i huvudfunktionen \ n", i);
paus(); // väntar tills signalen hanteras

 
returnera 0;

I skärmdumpen av utdata från Exempel 4.c, vi kan se att larmet fortsätter varannan sekund. Vi återställer larmet i sig_handler-funktionen.

I Exempel 5.c vi kommer att se hur vi kan fördröja det larm som redan har planerats. Vi använder SIGINT-signalen för avbrott. När användaren skriver Ctrl + C på tangentbordet, SIGINT genereras.

Exempel 5.c:

#omfatta
#omfatta
#omfatta
 
ogiltig sig_handler (int signum)
 
if (signum == SIGALRM) // signalhanterare för SIGALRM
 
printf ("Innehanteringsfunktion för SIGALRM \ n");
larm (2);

if (signum == SIGINT) // signalhanterare för SIGINT
printf ("\ nSnoozing i 5 sekunder ... \ n");
larm (5);

 

 
int main ()
 
signal (SIGALRM, sig_handler); // Registrera signalhanteraren för SIGALRM
signal (SIGINT, sig_handler); // Registrera signalhanteraren för SIGINT
 
larm (2); // Schemalägg det första larmet efter 2 sekunder
 
för (int i = 1 ;; i ++)
 
printf ("% d: Inne i huvudfunktionen \ n", i);
paus(); // väntar tills signalen hanteras

 
returnera 0;

I skärmdumpen av utdata från Exempel 5.c, vi kan se att när användartyp Ctrl + C återställs larmet 5 sekunder. I det här programmet har vi endast använt en hanteringsfunktion för två olika signaler men i hanterarfunktionen har det kontrollerats att för vilken signal hanterarfunktionen anropas.

Slutsats:

Så vi har sett att hur larmfunktion kan ställas in för att utlösa signal, hur man återställer larm, hur man avbryter redan planerat larm.

Shadow of the Tomb Raider for Linux Tutorial
Shadow of the Tomb Raider är det tolfte tillskottet till Tomb Raider-serien - en action-äventyrsspelfranchise skapad av Eidos Montreal. Spelet mottogs...
Hur man förbättrar FPS i Linux?
FPS står för Bildrutor per sekund. FPS: s uppgift är att mäta bildfrekvensen i videouppspelningar eller spelprestanda. Med enkla ord betecknas antalet...
De bästa Oculus App Lab-spelen
Om du är Oculus-headsetägare måste du vara förtjust i sidoladdning. Sideladdning är processen för att installera icke-butiksinnehåll på ditt headset. ...