C Programiranje

Kako uporabljati SIGALRM in funkcijo alarma v jeziku C?

Kako uporabljati SIGALRM in funkcijo alarma v jeziku C?
The alarm () funkcija se uporablja za generiranje SIGALRM signal po določenem času. V tem članku vam bomo pokazali, kako uporabljati alarm () funkcijo in SIGALRM signal v Linuxu. Torej, začnimo.

Sintaksa

nepodpisani int alarm (nepodpisane int sekunde)

Funkcija je definirana v unistd.h datoteka glave.

Argumenti

Funkcija ima en argument, sekund. Po sekund od zahteve za datoteko alarm() funkcija, SIGALRM signal se ustvari. Privzeto vedenje ob prejemu SIGALRM je ustaviti postopek. Toda signal lahko ujamemo in obvladamo. Glejte podrobnosti o ravnanju s signali.

The alarm () funkcija vrne vrednost, ki ni nič, če je bil predhodno nastavljen drug alarm in je vrednost število preostalih sekund za predhodni načrtovani alarm zaradi dostavljenega. V nasprotnem primeru alarm () vrne nič.

Primer1.c:

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Funkcija notranjega vodnika \ n");

 
int main ()
 
signal (SIGALRM, sig_handler); // Registriraj obdelavo signalov
 
alarm (2); // Načrtovani alarm po 2 sekundah
 
za (int i = 1 ;; i ++)
 
printf ("% d: Znotraj glavne funkcije \ n", i);
spanje (1); // Zamuda za 1 sekundo

vrnitev 0;

Na posnetku zaslona rezultata Primer1.c, program se zažene s pomočjo ukaza time, tako da lahko dobimo pregled nad časom izvajanja programa. Opazili smo, da v glavni funkciji, ki jo kličemo alarm () funkcija, načrtovana za 2 sekundi. Torej, ko se zanka izvaja, se po 2 sekundah pokliče funkcija sig_handler in izvajanje glavne funkcije se ustavi. Po izvedbi funkcije sig_handler se v glavni funkciji za izvajanje zanke nadaljuje. Tu uporabljamo funkcijo spanja za zakasnitev, da lahko razumemo potek izvedbe. Zanka for je neskončna zanka, ko pritisnemo prekinitveno tipko (Ctrl + C), se bo izvajanje ustavilo.

Ustvarjanje SIGALRM uporabo signal () funkcije ni mogoče zložiti. Samo en SIGALRM generiranje je mogoče načrtovati. Zaporedni klici signal () funkcija ponastavi budilko klicnega procesa.

Primer2.c:

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Funkcija notranjega vodnika \ n");

 
int main ()
 
signal (SIGALRM, sig_handler); // Registriraj obdelavo signalov
 
alarm (4); // Načrtovani alarm po 4 sekundah
alarm (1); // Načrtovani alarm po 1 sekundi
 
za (int i = 1 ;; i ++)
 
printf ("% d: Znotraj glavne funkcije \ n", i);
spanje (1); // Zamuda za 1 sekundo

 
vrnitev 0;

Na posnetku zaslona rezultata Primer2.c, vidimo, da je program izvedel več kot 7 sekund, vendar prvi alarm, ki je bil razporejen po 4 sekundah, ne kliče funkcije vodnika. Drugi alarm, ki je bil razporejen po 1 sekundi, se ponastavi.

Če je vrednost sekunde argumenta enaka nič, se vsa predhodno podana zahteva za alarm prekliče.

Primer3.c:

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Funkcija notranjega vodnika \ n");

 
int main ()
 
signal (SIGALRM, sig_handler); // Registriraj obdelavo signalov
 
alarm (2); // Načrtovani alarm po 2 sekundah
alarm (0); // Preklic prejšnjega alarma
 
za (int i = 1 ;; i ++)
 
printf ("% d: Znotraj glavne funkcije \ n", i);
spanje (1); // Zamuda za 1 sekundo

 
vrnitev 0;

Na posnetku zaslona rezultata Primer3.c, vidimo, da je prvi alarm, ki je bil razporejen po 2 sekundah, preklican zaradi drugega alarma za 0 sekund.

V Primer4.c videli bomo, kako neprekinjeno lahko nastavimo alarm za vsaki 2 sekundi.

Primer4.c:

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Funkcija notranjega vodnika \ n");
 
alarm (2); // Načrtujte nov alarm po 2 sekundah

 
int main ()
 
signal (SIGALRM, sig_handler); // Registriraj obdelavo signalov
 
alarm (2); // Načrtujte prvi alarm po 2 sekundah
 
za (int i = 1 ;; i ++)
 
printf ("% d: Znotraj glavne funkcije \ n", i);
pavza(); // čakanje do obdelave signala

 
vrnitev 0;

Na posnetku zaslona rezultata Primer4.c, vidimo, da je alarm neprekinjen v vsaki 2 sekundi. Alarm ponastavimo v funkciji sig_handler.

V Primer5.c videli bomo, kako lahko zakasnimo že načrtovani alarm. Za prekinitev bomo uporabili signal SIGINT. Ko uporabnik vtipka Ctrl + C na tipkovnici, POMEN signal bo ustvaril.

Primer5.c:

#include
#include
#include
 
void sig_handler (int signum)
 
if (signum == SIGALRM) // vodnik signala za SIGALRM
 
printf ("Funkcija notranjega vodnika za SIGALRM \ n");
alarm (2);

if (signum == SIGINT) // vodnik signala za SIGINT
printf ("\ nDremež za 5 sekund ... \ n");
alarm (5);

 

 
int main ()
 
signal (SIGALRM, sig_handler); // Registriraj obdelovalec signalov za SIGALRM
signal (SIGINT, sig_handler); // Registriraj obdelovalec signalov za SIGINT
 
alarm (2); // Načrtujte prvi alarm po 2 sekundah
 
za (int i = 1 ;; i ++)
 
printf ("% d: Znotraj glavne funkcije \ n", i);
pavza(); // čakanje do obdelave signala

 
vrnitev 0;

Na posnetku zaslona rezultata Primer5.c, vidimo, da se pri uporabniškem vnosu Ctrl + C alarm ponastavi za 5 sekund. V tem programu smo uporabili samo eno funkcijo handlerja za dva različna signala, v funkciji handler pa je preverjeno, za kateri signal se kliče funkcija handlerja.

Zaključek:

Tako smo videli, kako je mogoče nastaviti funkcijo alarma za sprožitev signala, kako ponastaviti alarm, kako preklicati že načrtovani alarm.

S temi brezplačnimi orodji dodajte gibe miške v sistem Windows 10
V zadnjih letih so se računalniki in operacijski sistemi močno razvili. Včasih so morali uporabniki uporabljati ukaze za krmarjenje po upraviteljih da...
Nadzirajte in upravljajte gibanje miške med več monitorji v sistemu Windows 10
Upravitelj miške z dvojnim zaslonom vam omogoča nadzor in konfiguriranje gibanja miške med več monitorji, tako da upočasni gibanje blizu meje. Windows...
WinMouse vam omogoča prilagajanje in izboljšanje premikanja kazalca miške v računalniku z operacijskim sistemom Windows
Če želite izboljšati privzete funkcije kazalca miške, uporabite brezplačno programsko opremo WinMouse. Dodaja več funkcij, s pomočjo katerih boste kar...