C programozás

A SIGALRM és a riasztási funkció használata C nyelven?

A SIGALRM és a riasztási funkció használata C nyelven?
A riasztás() függvény a SIGALRM jelzés meghatározott idő elteltével. Ebben a cikkben bemutatjuk, hogyan kell használni riasztás() funkció és SIGALRM jel Linux alatt. Tehát kezdjük.

Szintaxis

aláíratlan int riasztás (aláíratlan int másodperc)

A függvény meghatározása unistd.h fejlécfájl.

Érvek

A függvény egy argumentumot vesz fel, másodpercig. Utána másodpercig másodpercek teltek el a riasztás() funkció, a SIGALRM jel keletkezik. Az alapértelmezett viselkedés a SIGALRM a folyamat leállítása. De el tudjuk fogni és kezelni a jelet. Lásd a jelkezelés részleteit.

A riasztás() A függvény nem nulla értéket ad vissza, ha korábban már beállított egy másik riasztást, és az érték az előző ütemezett riasztáshoz hátralévő másodpercek száma a kézbesítés miatt. Másképp riasztás() nullát ad vissza.

1. példa.c:

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Belső kezelő funkció \ n");

 
int main ()
 
jel (SIGALRM, sig_handler); // Jelkezelő regisztrálása
 
riasztó (2); Ütemezett riasztás 2 másodperc múlva
 
mert (int i = 1 ;; i ++)
 
printf ("% d: Inside main function \ n", i);
alvás (1); // Késleltetés 1 másodpercig

visszatér 0;

A kimenet képernyőképén 1. példa.c, a program az time paranccsal fut, így áttekintést kaphatunk a program végrehajtási idejéről. Megfigyeltük, hogy a fő funkcióban hívjuk riasztás() funkció, 2 másodpercre ütemezve. Tehát a ciklus végrehajtásakor 2 másodperc múlva meghívjuk a sig_handler függvényt, és a fő funkció végrehajtása szünetel. A sig_handler függvény végrehajtása után a hurok végrehajtásának fő funkciójában folytatódik. Itt az alvás funkciót használjuk késleltetésre, hogy megértsük a végrehajtás menetét. A for ciklus egy végtelen hurok, amikor megnyomunk egy megszakító gombot (Ctrl + C), a végrehajtás leáll.

Generáló SIGALRM felhasználásával jel() funkció nem rakható egymásra. Csak egy SIGALRM generálása ütemezhető. Egymást követő hívások jel() funkció visszaállítja a hívási folyamat ébresztőóráját.

2. példa.c:

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Belső kezelő funkció \ n");

 
int main ()
 
jel (SIGALRM, sig_handler); // Jelkezelő regisztrálása
 
riasztó (4); Ütemezett riasztás 4 másodperc múlva
riasztás (1); Ütemezett riasztás 1 másodperc múlva
 
mert (int i = 1 ;; i ++)
 
printf ("% d: Inside main function \ n", i);
alvás (1); // Késleltetés 1 másodpercig

 
visszatér 0;

A kimenet képernyőképén 2. példa.c, láthatjuk, hogy a program több mint 7 másodpercet hajtott végre, de az első riasztás, amelyet 4 másodperc után ütemeztek be, nem hívja meg a kezelő funkciót. Az 1 másodperc után ütemezett második riasztás visszaállítja a riasztást.

Ha az argumentum másodpercek értéke nulla, akkor minden korábban kezdeményezett riasztási kérelem törlődik.

3. példa.c:

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Belső kezelő funkció \ n");

 
int main ()
 
jel (SIGALRM, sig_handler); // Jelkezelő regisztrálása
 
riasztó (2); Ütemezett riasztás 2 másodperc múlva
riasztás (0); // Törölte az előző riasztást
 
mert (int i = 1 ;; i ++)
 
printf ("% d: Inside main function \ n", i);
alvás (1); // Késleltetés 1 másodpercig

 
visszatér 0;

A kimenet képernyőképén 3. példa.c, láthatjuk, hogy az első riasztás, amelyet 2 másodperc után ütemeztek, törlődik a második riasztás miatt 0 másodpercre.

Ban ben 4. példa.c látni fogjuk, mennyire folyamatosan állíthatunk be riasztást 2 másodpercenként.

4. példa.c:

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Belső kezelő funkció \ n");
 
riasztó (2); // Új riasztás ütemezése 2 másodperc múlva

 
int main ()
 
jel (SIGALRM, sig_handler); // Jelkezelő regisztrálása
 
riasztó (2); // Az első riasztást 2 másodperc múlva ütemezze be
 
mert (int i = 1 ;; i ++)
 
printf ("% d: Inside main function \ n", i);
szünet(); // várakozás a jel kezelésére

 
visszatér 0;

A kimenet képernyőképén 4. példa.c, láthatjuk, hogy a riasztás 2 másodpercenként folyamatos. A riasztást a sig_handler függvényben állítottuk vissza.

Ban ben 5. példa.c meglátjuk, hogyan késleltethetjük a már beosztott riasztást. A megszakításhoz SIGINT jelet fogunk használni. Amikor a felhasználó beírja a Ctrl + C billentyűt, JEL jel fog generálni.

5. példa.c:

#include
#include
#include
 
void sig_handler (int signum)
 
if (signum == SIGALRM) // jelkezelő a SIGALRM számára
 
printf ("Belső kezelő funkció a SIGALRM számára \ n");
riasztó (2);

if (signum == SIGINT) // jelkezelő a SIGINT számára
printf ("\ n 5 másodperces szundi elhalasztás ... \ n");
riasztó (5);

 

 
int main ()
 
jel (SIGALRM, sig_handler); // Jelkezelő regisztrálása a SIGALRM szolgáltatáshoz
jel (SIGINT, sig_handler); // Jelkezelő regisztrálása a SIGINT számára
 
riasztó (2); // Az első riasztást 2 másodperc múlva ütemezze be
 
mert (int i = 1 ;; i ++)
 
printf ("% d: Inside main function \ n", i);
szünet(); // várakozás a jel kezelésére

 
visszatér 0;

A kimenet képernyőképén 5. példa.c, láthatjuk, hogy a Ctrl + C felhasználó típus esetén a riasztás 5 másodpercre visszaáll. Ebben a programban csak egy kezelő funkciót használtunk két különböző jelre, de a kezelő funkcióban ellenőriztük, hogy melyik jelre hívjuk a kezelő funkciót.

Következtetés:

Tehát láttuk, hogy hogyan lehet beállítani a riasztási funkciót a jel kiváltására, hogyan lehet visszaállítani a riasztást, hogyan lehet törölni a már ütemezett riasztást.

Sid Meier Civilization VI letöltése és lejátszása Linuxon
Bevezetés a játékba A Civilization 6 egy modern felvétel a Age of Empires játékok sorozatában bevezetett klasszikus koncepcióra. Az ötlet meglehetősen...
A Doom telepítése és lejátszása Linuxon
Bevezetés a Doom-ba A Doom sorozat a 90-es években keletkezett az eredeti Doom megjelenése után. Azonnali sláger volt, és ettől kezdve a játéksorozat ...
Vulkan Linux felhasználók számára
A grafikus kártyák minden új generációjával azt látjuk, hogy a játékfejlesztők átlépik a grafikus hűség határait, és egy lépéssel közelebb kerülnek a ...