Süntaks
allkirjastamata int-alarm (allkirjastamata int-sekundid)Funktsioon on määratletud unistd.h päisefail.
Argumendid
Funktsioon võtab ühe argumendi, sekundit. Pärast sekundit sekundi möödumisest on äratus() funktsioon SIGALRM signaal genereeritakse. Vaikekäitumine SIGALRM on protsess lõpetada. Kuid võime signaali kätte saada ja hakkama saada. Vaadake signaali käitlemise üksikasju.
The alarm () funktsioon tagastab väärtuse, mis pole null, kui varem on määratud teine alarm ja väärtus on eelmise ajastatud häire jaoks järelejäänud sekundite arv tarnitud. Muidu alarm () tagastab nulli.
Näide1.c:
# kaasata# kaasata
# kaasata
void sig_handler (int signum)
printf ("Sisemise käitleja funktsioon \ n");
int main ()
signaal (SIGALRM, sig_handler); // Registreerige signaalkäitleja
alarm (2); // Plaanitud alarm 2 sekundi pärast
jaoks (int i = 1 ;; i ++)
printf ("% d: sees põhifunktsioon \ n", i);
uni (1); // Viivitage 1 sekund
tagastama 0;
Rakenduse väljundi ekraanipildil Näide1.c, programmi käivitatakse käsu time abil, et saaksime ülevaate programmi täitmisajast. Täheldasime, et põhifunktsioonis kutsume alarm () funktsioon, ajastatud 2 sekundiks. Niisiis, kui tsükkel käivitatakse, kutsutakse 2 sekundi pärast funktsiooni sig_handler ja peatatakse põhifunktsiooni täitmine. Pärast funktsiooni sig_handler käivitamist jätkatakse tsükli täitmise põhifunktsioonis. Siin kasutame viivitamiseks unefunktsiooni, et saaksime mõista hukkamise voogu. For silmus on lõpmatu silmus, kui vajutame katkestusklahvi (Ctrl + C), peatatakse täitmine.
Tekitamine SIGALRM kasutades signaal() funktsiooni ei saa virnastada. Ainult üks SIGALRM põlvkonna saab ajastada. Järjestikused kõned signaal() funktsioon lähtestab helistamisprotsessi äratuskella.
Näide2.c:
# kaasata# kaasata
# kaasata
void sig_handler (int signum)
printf ("Sisemise käitleja funktsioon \ n");
int main ()
signaal (SIGALRM, sig_handler); // Registreerige signaalkäitleja
alarm (4); // Planeeritud alarm 4 sekundi pärast
alarm (1); // Planeeritud alarm 1 sekundi pärast
jaoks (int i = 1 ;; i ++)
printf ("% d: sees põhifunktsioon \ n", i);
uni (1); // Viivitage 1 sekund
tagastama 0;
Rakenduse väljundi ekraanipildil Näide2.c, näeme, et programm käivitas rohkem kui 7 sekundit, kuid esimene häire, mis oli planeeritud 4 sekundi pärast, ei kutsu käitleja funktsiooni. Teine häire, mis oli planeeritud pärast 1 sekundit, lähtestab alarmi.
Kui argumendi sekundite väärtus on null, tühistatakse kõik varem tehtud häiretaotlused.
Näide3.c:
# kaasata# kaasata
# kaasata
void sig_handler (int signum)
printf ("Sisemise käitleja funktsioon \ n");
int main ()
signaal (SIGALRM, sig_handler); // Registreerige signaalkäitleja
alarm (2); // Planeeritud alarm 2 sekundi pärast
alarm (0); // Tühistas eelmise alarmi
jaoks (int i = 1 ;; i ++)
printf ("% d: sees põhifunktsioon \ n", i);
uni (1); // Viivitage 1 sekund
tagastama 0;
Rakenduse väljundi ekraanipildil Näide3.c, näeme, et esimene häire, mis oli planeeritud 2 sekundi pärast, tühistatakse teise häire tõttu 0 sekundiks.
Sisse Näide4.c näeme, kui pidevalt saame iga 2 sekundi tagant äratust seada.
Näide4.c:
# kaasata# kaasata
# kaasata
void sig_handler (int signum)
printf ("Sisemise käitleja funktsioon \ n");
alarm (2); // Plaanige uus alarm 2 sekundi pärast
int main ()
signaal (SIGALRM, sig_handler); // Registreerige signaalkäitleja
alarm (2); // Ajastage esimene alarm 2 sekundi pärast
jaoks (int i = 1 ;; i ++)
printf ("% d: sees põhifunktsioon \ n", i);
paus (); // ootab kuni signaali käitlemiseni
tagastama 0;
Rakenduse väljundi ekraanipildil Näide4.c, näeme, et häire on pidev iga 2 sekundi järel. Alarmi lähtestame funktsioonis sig_handler.
Sisse Näide5.c näeme, kuidas saame juba kavandatud häiret edasi lükata. Katkestamiseks kasutame signaali SIGINT. Kui kasutaja sisestab klaviatuuril Ctrl + C, SIGINT signaal genereeritakse.
Näide5.c:
# kaasata# kaasata
# kaasata
void sig_handler (int signum)
if (signum == SIGALRM) // signaali käitleja SIGALRM-i jaoks
printf ("SIGALRM-i sisemise käitleja funktsioon \ n");
alarm (2);
if (signum == SIGINT) // signaali käitleja SIGINTile
printf ("\ nLükatakse viieks sekundiks ... \ n");
alarm (5);
int main ()
signaal (SIGALRM, sig_handler); // Registreerige SIGALRM-i signaalkäitleja
signaal (SIGINT, sig_handler); // Registreerige SIGINT-i signaalkäitleja
alarm (2); // Ajastage esimene alarm 2 sekundi pärast
jaoks (int i = 1 ;; i ++)
printf ("% d: sees põhifunktsioon \ n", i);
paus (); // ootab kuni signaali käitlemiseni
tagastama 0;
Rakenduse väljundi ekraanipildil Näide5.c, näeme, et kui kasutaja sisestab Ctrl + C, siis häire lähtestatakse 5 sekundit. Selles programmis oleme kahe erineva signaali jaoks kasutanud ainult ühte käitlejafunktsiooni, kuid käitleja funktsioonis on kontrollitud, millise signaali korral käitleja funktsiooni kutsutakse.
Järeldus:
Niisiis, oleme näinud, kuidas signaali käivitamiseks saab seadistada alarmi funktsiooni, kuidas alarmi lähtestada, kuidas juba ajastatud häiret tühistada.