Syntax
nepodpísaný int alarm (nepodpísané int sekundy)Funkcia je definovaná v unistd.h hlavičkový súbor.
Argumenty
Funkcia má jeden argument, sekúnd. Po sekúnd od požiadania o poplach() funkcia, SIGALRM generuje sa signál. Predvolené správanie pri prijatí SIGALRM je ukončiť proces. Ale môžeme zachytiť a zvládnuť signál. Zobraziť podrobnosti o spracovaní signálu.
The budík () funkcia vráti nenulovú hodnotu, ak bol predtým nastavený ďalší alarm a hodnota predstavuje počet sekúnd zostávajúcich pre predchádzajúci naplánovaný alarm z dôvodu doručenia. Inak budík () vráti nulu.
Príklad 1.c:
#include#include
#include
void sig_handler (int signum)
printf ("Funkcia Inside handler \ n");
int main ()
signál (SIGALRM, sig_handler); // Zaregistrujte obsluhu signálu
alarm (2); // Plánovaný alarm po 2 sekundách
pre (int i = 1 ;; i ++)
printf ("% d: Vnútri hlavnej funkcie \ n", i);
spánok (1); // Oneskorenie o 1 sekundu
návrat 0;
Na snímke obrazovky s výstupom z Príklad 1.c, program sa spúšťa pomocou príkazu čas, aby sme získali prehľad o čase vykonania programu. Pozorovali sme, že v hlavnej funkcii, ktorú voláme budík () funkcia, naplánovaná na 2 sekundy. Takže pre vykonanie slučky sa po 2 sekundách zavolá funkcia sig_handler a vykonávanie hlavnej funkcie sa pozastaví. Po vykonaní funkcie sig_handler sa v hlavnej funkcii pre vykonávanie slučky obnoví činnosť. Tu používame funkciu spánku na oneskorenie, aby sme pochopili priebeh vykonávania. Smyčka for je nekonečná slučka, keď stlačíme kláves prerušenia (Ctrl + C), vykonávanie sa zastaví.
Generovanie SIGALRM použitím signál () funkciu nemožno stohovať. Len jeden SIGALRM generáciu je možné naplánovať. Postupné volania z signál () funkcia reset budíka procesu volania.
Príklad 2.c:
#include#include
#include
void sig_handler (int signum)
printf ("Funkcia Inside handler \ n");
int main ()
signál (SIGALRM, sig_handler); // Zaregistrujte obsluhu signálu
alarm (4); // Plánovaný alarm po 4 sekundách
alarm (1); // Plánovaný alarm po 1 sekunde
pre (int i = 1 ;; i ++)
printf ("% d: Vnútri hlavnej funkcie \ n", i);
spánok (1); // Oneskorenie o 1 sekundu
návrat 0;
Na snímke obrazovky s výstupom z Príklad 2.c, vidíme, že program sa vykonal viac ako 7 sekúnd, ale prvý alarm, ktorý bol naplánovaný na 4 sekundy, nevyvoláva funkciu obsluhy. Druhý alarm, ktorý bol naplánovaný po 1 sekunde, resetuje alarm.
Ak je hodnota sekund argumentu nula, potom sa zruší akákoľvek predtým zadaná požiadavka na alarm.
Príklad3.c:
#include#include
#include
void sig_handler (int signum)
printf ("Funkcia Inside handler \ n");
int main ()
signál (SIGALRM, sig_handler); // Zaregistrujte obsluhu signálu
alarm (2); // Plánovaný alarm po 2 sekundách
alarm (0); // Zrušil predchádzajúci alarm
pre (int i = 1 ;; i ++)
printf ("% d: Vnútri hlavnej funkcie \ n", i);
spánok (1); // Oneskorenie o 1 sekundu
návrat 0;
Na snímke obrazovky s výstupom z Príklad3.c, vidíme, že prvý alarm, ktorý bol naplánovaný po 2 sekundách, je zrušený kvôli druhému alarmu na 0 sekúnd.
V Príklad4.c uvidíme, ako nepretržite môžeme nastaviť budík na každé 2 sekundy.
Príklad4.c:
#include#include
#include
void sig_handler (int signum)
printf ("Funkcia Inside handler \ n");
alarm (2); // Naplánujte nový alarm po 2 sekundách
int main ()
signál (SIGALRM, sig_handler); // Zaregistrujte obsluhu signálu
alarm (2); // Naplánujte prvý alarm na 2 sekundy
pre (int i = 1 ;; i ++)
printf ("% d: Vnútri hlavnej funkcie \ n", i);
pauza(); // čakanie na spracovanie signálu
návrat 0;
Na snímke obrazovky s výstupom z Príklad4.c, vidíme, že alarm je nepretržitý každé 2 sekundy. Resetujeme alarm vo funkcii sig_handler.
V Príklad5.c uvidíme, ako môžeme oddialiť už naplánovaný alarm. Na prerušenie použijeme signál SIGINT. Keď používateľ napíše Ctrl + C na klávesnici, SIGINT signál sa vygeneruje.
Príklad5.c:
#include#include
#include
void sig_handler (int signum)
if (signum == SIGALRM) // obsluha signálu pre SIGALRM
printf ("Funkcia Inside Handler pre SIGALRM \ n");
alarm (2);
if (signum == SIGINT) // obsluha signálu pre SIGINT
printf ("\ nOdloženie na 5 sekúnd ... \ n");
alarm (5);
int main ()
signál (SIGALRM, sig_handler); // Zaregistrujte obsluhu signálu pre SIGALRM
signál (SIGINT, sig_handler); // Zaregistrujte obsluhu signálu pre SIGINT
alarm (2); // Naplánujte prvý alarm na 2 sekundy
pre (int i = 1 ;; i ++)
printf ("% d: Vnútri hlavnej funkcie \ n", i);
pauza(); // čakanie na spracovanie signálu
návrat 0;
Na snímke obrazovky s výstupom z Príklad5.c, vidíme, že keď užívateľ zadá Ctrl + C, alarm sa resetuje na 5 sekúnd. V tomto programe sme použili iba jednu funkciu obsluhy pre dva rôzne signály, ale vo funkcii obsluhy bolo skontrolované, pre ktorý signál sa funkcia obsluhy volá.
Záver:
Videli sme teda, že ako je možné nastaviť funkciu alarmu pre spúšťací signál, ako resetovať alarm, ako zrušiť už naplánovaný alarm.