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.