C Programovanie

Ako používať SIGALRM a funkciu alarmu v jazyku C?

Ako používať SIGALRM a funkciu alarmu v jazyku C?
The budík () funkcia sa používa na generovanie a SIGALRM signál po uplynutí stanoveného času. V tomto článku vám ukážeme, ako používať budík () funkcie a SIGALRM signál v Linuxe. Takže poďme na to.

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.

Hry Najlepšie emulátory herných konzol pre systém Linux
Najlepšie emulátory herných konzol pre systém Linux
V tomto článku je uvedený zoznam populárneho softvéru na emuláciu herných konzol, ktorý je k dispozícii pre systém Linux. Emulácia je vrstva kompatibi...
Hry Najlepšie linuxové distribúcie pre hry v roku 2021
Najlepšie linuxové distribúcie pre hry v roku 2021
Operačný systém Linux prešiel dlhou cestou od svojho originálneho, jednoduchého serverového vzhľadu. Tento OS sa za posledné roky nesmierne vylepšil a...
Hry Ako zachytiť a streamovať vašu hernú reláciu v systéme Linux
Ako zachytiť a streamovať vašu hernú reláciu v systéme Linux
V minulosti sa hranie hier považovalo iba za hobby, ale časom došlo v hernom priemysle k obrovskému nárastu z hľadiska technológie i počtu hráčov. Her...