C programavimas

Kaip naudotis SIGALRM ir aliarmo funkcija C kalba?

Kaip naudotis SIGALRM ir aliarmo funkcija C kalba?
The signalizacija () funkcija naudojama generuoti a SIGALRM signalą praėjus tam tikram laikui. Šiame straipsnyje mes jums parodysime, kaip naudotis signalizacija () funkcija ir SIGALRM signalas „Linux“. Taigi, pradėkime.

Sintaksė

nepasirašytas int signalas (nepasirašytos int sekundės)

Funkcija apibrėžta unistd.h antraštės failas.

Argumentai

Funkcijai reikia vieno argumento, sekundžių. Po sekundžių sekundžių praėjo nuo prašymo signalizacija() funkcija SIGALRM generuojamas signalas. Numatytasis elgesys gavus SIGALRM yra nutraukti procesą. Bet mes galime pagauti ir valdyti signalą. Žr. Išsamią signalų valdymo informaciją.

The signalizacija () funkcija grąžins ne nulinę vertę, jei anksčiau buvo nustatytas kitas pavojaus signalas ir reikšmė yra sekundžių, likusių dėl ankstesnio suplanuoto aliarmo dėl pristatymo, skaičius. Kitaip signalizacija () grąžins nulį.

1 pavyzdys.c:

# įtraukti
# įtraukti
# įtraukti
 
negaliojantis sig_handler (int signum)
 
printf ("Vidinio tvarkytuvo funkcija \ n");

 
int main ()
 
signalas (SIGALRM, sig_handler); // Registruokite signalo tvarkytuvą
 
signalizacija (2); // Suplanuotas aliarmas po 2 sekundžių
 
už (int i = 1 ;; i ++)
 
printf ("% d: Viduje pagrindinė funkcija \ n", i);
miegas (1); // Vėluoja 1 sekundę

grąžinti 0;

Išvesties ekrano kopijoje 1 pavyzdys.c, programa vykdoma naudojant laiko komandą, kad galėtume apžvelgti programos vykdymo laiką. Mes pastebėjome, kad pagrindinėje funkcijoje mes vadiname signalizacija () funkcija, suplanuota 2 sekundėms. Taigi, vykdant kilpą, po 2 sekundžių iškviečiama sig_handler funkcija ir sustabdoma pagrindinės funkcijos vykdymas. Įvykdžius sig_handler funkciją, atnaujinama pagrindinė ciklo vykdymo funkcija. Čia mes naudojame miego funkciją atidedant, kad galėtume suprasti vykdymo eigą. „For“ kilpa yra begalinė kilpa, kai paspausime pertraukimo klavišą („Ctrl“ + C), vykdymas sustos.

Generuoja SIGALRM naudojant signalas () funkcijos negalima sukrauti. Tik vienas SIGALRM karta gali būti suplanuota. Nuoseklūs skambučiai signalas () funkcija atstato skambinimo proceso žadintuvą.

2 pavyzdys.c:

# įtraukti
# įtraukti
# įtraukti
 
negaliojantis sig_handler (int signum)
 
printf ("Vidinio tvarkytuvo funkcija \ n");

 
int main ()
 
signalas (SIGALRM, sig_handler); // Registruokite signalo tvarkytuvą
 
signalizacija (4); // Suplanuotas aliarmas po 4 sekundžių
signalizacija (1); // Suplanuotas aliarmas po 1 sekundės
 
už (int i = 1 ;; i ++)
 
printf ("% d: Viduje pagrindinė funkcija \ n", i);
miegas (1); // Vėluoja 1 sekundę

 
grąžinti 0;

Išvesties ekrano kopijoje 2 pavyzdys.c, matome, kad programa vykdė daugiau nei 7 sekundes, tačiau pirmasis signalas, kuris buvo suplanuotas po 4 sekundžių, nekviečia tvarkyklės funkcijos. Antrasis pavojaus signalas, kuris buvo suplanuotas po 1 sekundės, iš naujo nustato signalą.

Jei argumento sekundžių reikšmė lygi nuliui, bet kuri anksčiau pateikta aliarmo užklausa atšaukiama.

3 pavyzdys.c:

# įtraukti
# įtraukti
# įtraukti
 
negaliojantis sig_handler (int signum)
 
printf ("Vidinio tvarkytuvo funkcija \ n");

 
int main ()
 
signalas (SIGALRM, sig_handler); // Registruokite signalo tvarkytuvą
 
signalizacija (2); // Suplanuotas aliarmas po 2 sekundžių
signalizacija (0); // Atšaukė ankstesnį aliarmą
 
už (int i = 1 ;; i ++)
 
printf ("% d: Viduje pagrindinė funkcija \ n", i);
miegas (1); // Vėluoja 1 sekundę

 
grąžinti 0;

Išvesties ekrano kopijoje 3 pavyzdys.c, matome, kad pirmasis signalas, kuris buvo suplanuotas po 2 sekundžių, yra atšauktas dėl antrojo aliarmo 0 sekundžių.

Į 4 pavyzdys.c pamatysime, kaip nuolat galime nustatyti žadintuvą kas 2 sekundes.

4 pavyzdys.c:

# įtraukti
# įtraukti
# įtraukti
 
negaliojantis sig_handler (int signum)
 
printf ("Vidinio tvarkytuvo funkcija \ n");
 
signalizacija (2); // Suplanuokite naują aliarmą po 2 sekundžių

 
int main ()
 
signalas (SIGALRM, sig_handler); // Registruokite signalo tvarkytuvą
 
signalizacija (2); // Suplanuokite pirmąjį aliarmą po 2 sekundžių
 
už (int i = 1 ;; i ++)
 
printf ("% d: Viduje pagrindinė funkcija \ n", i);
Pauzė(); // laukiu, kol bus apdorotas signalas

 
grąžinti 0;

Išvesties ekrano kopijoje 4 pavyzdys.c, matome, kad aliarmas yra nepertraukiamas kas 2 sekundes. Signalą nustatome iš naujo sig_handler funkcijoje.

Į 5 pavyzdys.c pamatysime, kaip pavėlinti jau numatytą signalizaciją. Nutraukimui naudosime SIGINT signalą. Kai vartotojas klaviatūroje įveda „Ctrl“ + C, ŽENKLAS generuos signalą.

5 pavyzdys.c:

# įtraukti
# įtraukti
# įtraukti
 
negaliojantis sig_handler (int signum)
 
if (signum == SIGALRM) // SIGALRM signalo tvarkytuvas
 
printf ("SIGALRM vidinio tvarkytuvo funkcija \ n");
signalizacija (2);

if (signum == SIGINT) // SIGINT signalo tvarkytuvas
printf ("\ nSnaudimas 5 sekundėms ... \ n");
signalizacija (5);

 

 
int main ()
 
signalas (SIGALRM, sig_handler); // Užregistruokite SIGALRM signalo tvarkytuvą
signalas (SIGINT, sig_handler); // Užregistruokite SIGINT signalo tvarkytuvą
 
signalizacija (2); // Suplanuokite pirmąjį aliarmą po 2 sekundžių
 
už (int i = 1 ;; i ++)
 
printf ("% d: Viduje pagrindinė funkcija \ n", i);
Pauzė(); // laukiu, kol bus apdorotas signalas

 
grąžinti 0;

Išvesties ekrano kopijoje 5 pavyzdys.c, matome, kad, kai vartotojo tipas Ctrl + C, signalas iš naujo nustatomas 5 sekundes. Šioje programoje dviem skirtingiems signalams naudojome tik vieną tvarkytojo funkciją, tačiau tvarkytuvo funkcijoje buvo patikrinta, kuriam signalui skambinama prižiūrėtojo funkcija.

Išvada:

Taigi, matėme, kad kaip galima nustatyti signalo įjungimo signalą, kaip atkurti signalą, kaip atšaukti jau suplanuotą signalą.

Atvirojo kodo komercinių žaidimų variklių uostai
Nemokami atvirojo kodo ir įvairių platformų žaidimų varikliai gali būti naudojami žaidžiant senus ir kai kuriuos gana naujus žaidimų pavadinimus. Šiam...
Geriausi „Linux“ komandinės eilutės žaidimai
Komandų eilutė yra ne tik jūsų didžiausias sąjungininkas naudojant „Linux“, bet ir pramogų šaltinis, nes ją galite naudoti norėdami žaisti daug įdomių...
Geriausios „Linux“ skirtos „Gamepad“ žemėlapių sudarymo programos
Jei jums patinka žaisti žaidimus „Linux“ su žaidimų pultu, o ne įprasta klaviatūra ir pelės įvesties sistema, yra keletas jums naudingų programų. Daug...