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.