C Programování

Jak používat SIGALRM a funkci alarmu v jazyce C?

Jak používat SIGALRM a funkci alarmu v jazyce C?
The poplach() funkce se používá ke generování a SIGALRM signál po uplynutí stanovené doby. V tomto článku vám ukážeme, jak používat poplach() funkce a SIGALRM signál v Linuxu. Pojďme tedy začít.

Syntax

nepodepsaný int alarm (nepodepsaný int sekund)

Funkce je definována v unistd.h hlavičkový soubor.

Argumenty

Funkce trvá jeden argument, sekundy. Po sekundy od požadavku na poplach() funkce, SIGALRM je generován signál. Výchozí chování při přijetí SIGALRM je ukončit proces. Můžeme však zachytit a zvládnout signál. Viz podrobnosti zpracování signálu.

The poplach() funkce vrátí nenulovou hodnotu, pokud byl dříve nastaven jiný alarm a hodnota je počet sekund zbývajících pro předchozí naplánovaný alarm kvůli doručenému. v opačném případě poplach() vrátí nulu.

Příklad 1.C:

#zahrnout
#zahrnout
#zahrnout
 
void sig_handler (int signum)
 
printf ("Funkce Inside Handler \ n");

 
int main ()
 
signál (SIGALRM, sig_handler); // Zaregistrujte obsluhu signálu
 
alarm (2); // Naplánovaný alarm po 2 sekundách
 
pro (int i = 1 ;; i ++)
 
printf ("% d: Uvnitř hlavní funkce \ n", i);
spánek (1); // Zpoždění o 1 sekundu

návrat 0;

Na snímku obrazovky výstupu Příklad 1.C, program se spouští pomocí příkazu time, abychom získali přehled o době provádění programu. Zjistili jsme, že v hlavní funkci, kterou voláme poplach() funkce naplánovaná na 2 sekundy. Takže pro provádění smyčky se po 2 sekundách volá funkce sig_handler a provádění hlavní funkce se pozastaví. Po provedení funkce sig_handler se v hlavní funkci pro provádění smyčky obnoví. Zde používáme funkci spánku pro zpoždění, abychom mohli pochopit průběh provádění. Smyčka for je nekonečná smyčka, když stiskneme klávesu přerušení (Ctrl + C), provádění se zastaví.

Generování SIGALRM použitím signál() funkci nelze skládat. Jen jeden SIGALRM generace lze naplánovat. Postupná volání z signál() funkce reset budíku procesu volání.

Příklad 2.c:

#zahrnout
#zahrnout
#zahrnout
 
void sig_handler (int signum)
 
printf ("Funkce Inside Handler \ n");

 
int main ()
 
signál (SIGALRM, sig_handler); // Zaregistrujte obsluhu signálu
 
alarm (4); // Naplánovaný alarm po 4 sekundách
alarm (1); // Naplánovaný alarm po 1 sekundě
 
pro (int i = 1 ;; i ++)
 
printf ("% d: Uvnitř hlavní funkce \ n", i);
spánek (1); // Zpoždění o 1 sekundu

 
návrat 0;

Na snímku obrazovky výstupu Příklad 2.C, vidíme, že program byl spuštěn déle než 7 sekund, ale první alarm, který byl naplánován po 4 sekundách, nevyvolává funkci obslužné rutiny. Druhý alarm, který byl naplánován po 1 sekundě, resetuje alarm.

Pokud je hodnota sekund argumentu nula, zruší se jakýkoli dříve vytvořený požadavek na alarm.

Příklad 3.C:

#zahrnout
#zahrnout
#zahrnout
 
void sig_handler (int signum)
 
printf ("Funkce Inside Handler \ n");

 
int main ()
 
signál (SIGALRM, sig_handler); // Zaregistrujte obsluhu signálu
 
alarm (2); // Naplánovaný alarm po 2 sekundách
alarm (0); // Zrušil předchozí alarm
 
pro (int i = 1 ;; i ++)
 
printf ("% d: Uvnitř hlavní funkce \ n", i);
spánek (1); // Zpoždění o 1 sekundu

 
návrat 0;

Na snímku obrazovky výstupu Příklad 3.C, vidíme, že první alarm, který byl naplánován po 2 sekundách, je zrušen kvůli druhému alarmu na 0 sekund.

v Příklad 4.C uvidíme, jak nepřetržitě můžeme nastavit budík každé 2 sekundy.

Příklad 4.C:

#zahrnout
#zahrnout
#zahrnout
 
void sig_handler (int signum)
 
printf ("Funkce 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 první alarm po 2 sekundách
 
pro (int i = 1 ;; i ++)
 
printf ("% d: Uvnitř hlavní funkce \ n", i);
pauza(); // čekání na zpracování signálu

 
návrat 0;

Na snímku obrazovky výstupu Příklad 4.C, vidíme, že alarm je nepřetržitý každé 2 sekundy. Resetujeme alarm ve funkci sig_handler.

v Příklad 5.C uvidíme, jak můžeme odložit již naplánovaný alarm. K přerušení použijeme signál SIGINT. Když uživatel zadá Ctrl + C na klávesnici, SIGINT bude generován signál.

Příklad 5.C:

#zahrnout
#zahrnout
#zahrnout
 
void sig_handler (int signum)
 
if (signum == SIGALRM) // obsluha signálu pro SIGALRM
 
printf ("Funkce Inside Handler pro SIGALRM \ n");
alarm (2);

if (signum == SIGINT) // obsluha signálu pro SIGINT
printf ("\ nOdložení na 5 sekund ... \ n");
alarm (5);

 

 
int main ()
 
signál (SIGALRM, sig_handler); // Zaregistrujte obsluhu signálu pro SIGALRM
signál (SIGINT, sig_handler); // Zaregistrujte obsluhu signálu pro SIGINT
 
alarm (2); // Naplánujte první alarm po 2 sekundách
 
pro (int i = 1 ;; i ++)
 
printf ("% d: Uvnitř hlavní funkce \ n", i);
pauza(); // čekání na zpracování signálu

 
návrat 0;

Na snímku obrazovky výstupu Příklad 5.C, vidíme, že když uživatel zadá Ctrl + C, alarm se resetuje na 5 sekund. V tomto programu jsme použili pouze jednu funkci obslužné rutiny pro dva různé signály, ale ve funkci obslužné rutiny bylo zkontrolováno, že pro jaký signál je funkce obslužné rutiny volána.

Závěr:

Viděli jsme tedy, jak lze nastavit funkci alarmu pro spouštěcí signál, jak resetovat alarm, jak zrušit již naplánovaný alarm.

Trackpad a ukazatel myši AppyMouse na obrazovce pro tablety Windows
Uživatelé tabletů často postrádají ukazatel myši, zejména když obvykle používají notebooky. Dotykové smartphony a tablety mají mnoho výhod a jediným o...
Střední tlačítko myši nefunguje ve Windows 10
The prostřední tlačítko myši pomáhá procházet dlouhé webové stránky a obrazovky se spoustou dat. Pokud se to zastaví, budete nakonec používat klávesni...
Jak změnit levé a pravé tlačítko myši na počítači se systémem Windows 10
Je úplnou normou, že všechna zařízení počítačových myší jsou ergonomicky navržena pro praváky. K dispozici jsou však myší zařízení, která jsou speciál...