C Programiranje

Kako se koristi SIGALRM i funkcija alarma na C jeziku?

Kako se koristi SIGALRM i funkcija alarma na C jeziku?
The alarm() funkcija se koristi za generiranje a SIGALRM signal nakon određenog vremena. U ovom ćemo vam članku pokazati kako se koristi alarm() funkcija i SIGALRM signal u Linuxu. Pa, krenimo.

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.

SuperTuxKart za Linux
SuperTuxKart sjajan je naslov osmišljen kako bi vam besplatno pružio iskustvo Mario Kart na vašem Linux sustavu. Prilično je izazovno i zabavno igrati...
Vodič za bitku za Wesnoth
Bitka za Wesnoth jedna je od najpopularnijih strateških igara otvorenog koda koje trenutno možete igrati. Ne samo da se ova igra razvija već jako dugo...
0 A.D. Vodič
Od mnogih strateških igara tamo, 0 A.D. uspijeva se istaknuti kao sveobuhvatan naslov i vrlo duboka, taktička igra unatoč tome što je otvoren izvor. R...