Sintaksa
nepotpisani int alarm (nepotpisane int sekunde)Funkcija je definirana u unistd.h datoteka zaglavlja.
Argumenti
Funkcija uzima jedan argument, sekunde. Nakon sekunde od zahtjeva za. proteklo je nekoliko sekundi alarm() funkcija, SIGALRM generira se signal. Zadano ponašanje pri primanju SIGALRM je zaustaviti postupak. Ali, možemo uhvatiti signal i nositi se s njim. Pogledajte detalje o rukovanju signalom.
The alarm() funkcija će vratiti vrijednost koja nije nula ako je prethodno postavljen drugi alarm i vrijednost je broj sekundi preostalih za prethodni zakazani alarm zbog isporučenog. Inače alarm() vratit će nulu.
Primjer1.c:
#include#include
#include
void sig_handler (int signum)
printf ("Unutarnja funkcija rukovaoca \ n");
int main ()
signal (SIGALRM, sig_handler); // Registriraj obrađivač signala
alarm (2); // Planirani alarm nakon 2 sekunde
za (int i = 1 ;; i ++)
printf ("% d: Unutar glavne funkcije \ n", i);
spavanje (1); // Odgoda za 1 sekundu
return 0;
Na snimci zaslona rezultata Primjer1.c, program se izvodi pomoću naredbe time, tako da možemo dobiti pregled vremena izvršenja programa. Primijetili smo da u glavnoj funkciji koju zovemo alarm() funkcija, zakazana za 2 sekunde. Dakle, for petlja se izvršava, nakon 2 sekunde poziva se funkcija sig_handler i zaustavlja se izvršavanje glavne funkcije. Nakon izvršavanja funkcije sig_handler, u glavnoj funkciji za izvršavanje petlje se nastavlja. Ovdje koristimo funkciju spavanja za odgađanje kako bismo mogli razumjeti tijek izvršenja. Petlja for je beskonačna petlja, kada pritisnemo tipku za prekidanje (Ctrl + C), izvršenje će se zaustaviti.
Generiranje SIGALRM koristeći signal() funkcija se ne može slagati. Samo jedan SIGALRM generacija se može zakazati. Uzastopni pozivi korisnika signal() funkcija resetiranje budilice procesa poziva.
Primjer2.c:
#include#include
#include
void sig_handler (int signum)
printf ("Unutarnja funkcija rukovaoca \ n");
int main ()
signal (SIGALRM, sig_handler); // Registriraj obrađivač signala
alarm (4); // Planirani alarm nakon 4 sekunde
alarm (1); // Planirani alarm nakon 1 sekunde
za (int i = 1 ;; i ++)
printf ("% d: Unutar glavne funkcije \ n", i);
spavanje (1); // Odgoda za 1 sekundu
return 0;
Na snimci zaslona rezultata Primjer2.c, možemo vidjeti da je program izvršio više od 7 sekundi, ali prvi alarm koji je bio zakazan nakon 4 sekunde ne poziva funkciju rukovatelja. Drugi alarm koji je bio zakazan nakon 1 sekunde resetira alarm.
Ako je vrijednost sekundi argumenta nula, tada se otkazuje bilo koji prethodno upućen zahtjev za alarmom.
Primjer3.c:
#include#include
#include
void sig_handler (int signum)
printf ("Unutarnja funkcija rukovaoca \ n");
int main ()
signal (SIGALRM, sig_handler); // Registriraj obrađivač signala
alarm (2); // Planirani alarm nakon 2 sekunde
alarm (0); // Otkazan je prethodni alarm
za (int i = 1 ;; i ++)
printf ("% d: Unutar glavne funkcije \ n", i);
spavanje (1); // Odgoda za 1 sekundu
return 0;
Na snimci zaslona rezultata Primjer3.c, možemo vidjeti da je prvi alarm koji je bio zakazan nakon 2 sekunde otkazan zbog drugog alarma na 0 sekundi.
U Primjer4.c vidjet ćemo kako neprekidno možemo postavljati alarm svake 2 sekunde.
Primjer4.c:
#include#include
#include
void sig_handler (int signum)
printf ("Unutarnja funkcija rukovaoca \ n");
alarm (2); // Zakažite novi alarm nakon 2 sekunde
int main ()
signal (SIGALRM, sig_handler); // Registriraj obrađivač signala
alarm (2); // Zakažite prvi alarm nakon 2 sekunde
za (int i = 1 ;; i ++)
printf ("% d: Unutar glavne funkcije \ n", i);
pauza(); // čekanje dok se ne obradi signal
return 0;
Na snimci zaslona rezultata Primjer4.c, možemo vidjeti da je alarm neprekidan u svake 2 sekunde. Resetirali smo alarm u funkciji sig_handler.
U Primjer5.c vidjet ćemo kako možemo odgoditi već zakazani alarm. Za prekid ćemo koristiti signal SIGINT. Kada korisnik na tipkovnici upiše Ctrl + C, ZNAK signal će generirati.
Primjer5.c:
#include#include
#include
void sig_handler (int signum)
if (signum == SIGALRM) // rukovatelj signalom za SIGALRM
printf ("Unutarnja funkcija rukovatelja za SIGALRM \ n");
alarm (2);
if (signum == SIGINT) // rukovatelj signalom za SIGINT
printf ("\ nDrijemanje 5 sekundi ... \ n");
alarm (5);
int main ()
signal (SIGALRM, sig_handler); // Registriraj obrađivač signala za SIGALRM
signal (SIGINT, sig_handler); // Registriraj obrađivač signala za SIGINT
alarm (2); // Zakažite prvi alarm nakon 2 sekunde
za (int i = 1 ;; i ++)
printf ("% d: Unutar glavne funkcije \ n", i);
pauza(); // čekanje dok se ne obradi signal
return 0;
Na snimci zaslona rezultata Primjer5.c, možemo vidjeti da se kada se korisnik upiše Ctrl + C alarm resetira za 5 sekundi. U ovom smo programu koristili samo jednu funkciju rukovatelja za dva različita signala, ali u funkciji rukovatelja provjereno je da li se za koji signal poziva funkcija rukovatelja.
Zaključak:
Dakle, vidjeli smo kako se funkcija alarma može postaviti za aktiviranje signala, kako resetirati alarm, kako otkazati već zakazani alarm.