C Programmeerimine

Kuidas kasutada SIGALRM-i ja häirefunktsiooni C-keeles?

Kuidas kasutada SIGALRM-i ja häirefunktsiooni C-keeles?
The alarm () funktsiooni kasutatakse a genereerimiseks SIGALRM signaali pärast teatud aja möödumist. Selles artiklis me näitame teile, kuidas seda kasutada alarm () funktsioon ja SIGALRM signaal Linuxis. Alustame siis.

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.

Jäljendage hiireklikke, hõljutades hiirega klõpsutut hiirt Windows 10-s
Hiire või klaviatuuri kasutamine liigses kasutamises vales asendis võib põhjustada palju terviseprobleeme, sealhulgas tüve, karpaalkanali sündroom ja ...
Nende tasuta tööriistade abil lisage Windows 10-le hiire liigutused
Viimastel aastatel on arvutid ja operatsioonisüsteemid palju arenenud. Oli aeg, mil kasutajad pidid failihaldurites navigeerimiseks kasutama käske. Na...
Juhtige ja hallake hiire liikumist mitme kuvari vahel Windows 10-s
Dual Display Mouse Manager võimaldab teil kontrollida ja konfigureerida hiire liikumist mitme monitori vahel, aeglustades selle liikumist piiri läheda...