C Програмиране

Как да използвам SIGALRM и функцията за аларма на C език?

Как да използвам SIGALRM и функцията за аларма на C език?
The аларма() функция се използва за генериране на SIGALRM сигнал след определен период от време. В тази статия ще ви покажем как да използвате аларма() функция и SIGALRM сигнал в Linux. И така, нека започнем.

Синтаксис

неподписана аларма int (неподписани int секунди)

Функцията е дефинирана в unistd.з заглавен файл.

Аргументи

Функцията приема един аргумент, секунди. След секунди са изминали секунди от искането на аларма() функция, SIGALRM генерира се сигнал. Поведението по подразбиране при получаване на SIGALRM е да се прекрати процесът. Но ние можем да уловим и да се справим със сигнала. Вижте подробности за обработка на сигнала.

The аларма() функция ще върне ненулева стойност, ако преди това е била зададена друга аларма и стойността е броят на оставащите секунди за предишната насрочена аларма поради доставена. В противен случай аларма() ще върне нула.

Пример1.° С:

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Функция за вътрешен манипулатор \ n");

 
int main ()
 
сигнал (SIGALRM, sig_handler); // Регистрирайте манипулатора на сигнала
 
аларма (2); // Планирана аларма след 2 секунди
 
за (int i = 1 ;; i ++)
 
printf ("% d: Вътре в основната функция \ n", i);
сън (1); // Забавяне за 1 секунда

връщане 0;

В екранната снимка на изхода на Пример1.° С, програмата се изпълнява с помощта на команда time, за да можем да получим преглед на времето за изпълнение на програмата. Забелязахме, че в основната функция, която наричаме аларма() функция, планирана за 2 секунди. И така, цикълът for се изпълнява, след 2 секунди се извиква функцията sig_handler и изпълнението на основната функция се спира. След изпълнение на функцията sig_handler, в основната функция за изпълнение на цикъл се възобновява. Тук използваме функцията за заспиване за забавяне, за да можем да разберем потока на изпълнението. Цикълът for е безкраен цикъл, когато натиснем клавиш за прекъсване (Ctrl + C), изпълнението ще спре.

Генериране SIGALRM използвайки сигнал () функцията не може да бъде подредена. Само един SIGALRM генериране може да бъде насрочено. Последователни обаждания на сигнал () функция нулиране на будилника на процеса на повикване.

Пример2.° С :

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Функция за вътрешен манипулатор \ n");

 
int main ()
 
сигнал (SIGALRM, sig_handler); // Регистрирайте манипулатора на сигнала
 
аларма (4); // Планирана аларма след 4 секунди
аларма (1); // Планирана аларма след 1 секунда
 
за (int i = 1 ;; i ++)
 
printf ("% d: Вътре в основната функция \ n", i);
сън (1); // Забавяне за 1 секунда

 
връщане 0;

В екранната снимка на изхода на Пример2.° С, можем да видим, че програмата изпълнява повече от 7 секунди, но първата аларма, която е била насрочена след 4 секунди, не извиква функцията манипулатор. Втората аларма, която е била насрочена след 1 секунда, анулира алармата.

Ако стойността на аргумента секунди е нула, тогава всяка направена по-рано заявка за аларма се отменя.

Пример3.° С:

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Функция за вътрешен манипулатор \ n");

 
int main ()
 
сигнал (SIGALRM, sig_handler); // Регистрирайте манипулатора на сигнала
 
аларма (2); // Планирана аларма след 2 секунди
аларма (0); // Отмени предишната аларма
 
за (int i = 1 ;; i ++)
 
printf ("% d: Вътре в основната функция \ n", i);
сън (1); // Забавяне за 1 секунда

 
връщане 0;

В екранната снимка на изхода на Пример3.° С, можем да видим, че първата аларма, която е планирана след 2 секунди, се анулира поради втората аларма за 0 секунди.

В Пример4.° С ще видим колко непрекъснато можем да задаваме аларма на всеки 2 секунди.

Пример4.° С:

#include
#include
#include
 
void sig_handler (int signum)
 
printf ("Функция за вътрешен манипулатор \ n");
 
аларма (2); // Планирайте нова аларма след 2 секунди

 
int main ()
 
сигнал (SIGALRM, sig_handler); // Регистрирайте манипулатора на сигнала
 
аларма (2); // Планирайте първата аларма след 2 секунди
 
за (int i = 1 ;; i ++)
 
printf ("% d: Вътре в основната функция \ n", i);
пауза (); // изчакваме, докато сигналът бъде обработен

 
връщане 0;

В екранната снимка на изхода на Пример4.° С, можем да видим, че алармата е непрекъсната на всеки 2 секунди. Нулираме алармата във функцията sig_handler.

В Пример5.° С ще видим как можем да отложим вече планираната аларма. За прекъсване ще използваме сигнал SIGINT. Когато потребителят въведе Ctrl + C в клавиатурата, ЗНАЧЕНИЕ сигнал ще се генерира.

Пример5.° С:

#include
#include
#include
 
void sig_handler (int signum)
 
if (signum == SIGALRM) // манипулатор на сигнала за SIGALRM
 
printf ("Функция за вътрешен манипулатор за SIGALRM \ n");
аларма (2);

if (signum == SIGINT) // манипулатор на сигнала за SIGINT
printf ("\ n Отлагане за 5 секунди ... \ n");
аларма (5);

 

 
int main ()
 
сигнал (SIGALRM, sig_handler); // Регистрирайте манипулатора на сигнал за SIGALRM
сигнал (SIGINT, sig_handler); // Регистрирайте манипулатора на сигнала за SIGINT
 
аларма (2); // Планирайте първата аларма след 2 секунди
 
за (int i = 1 ;; i ++)
 
printf ("% d: Вътре в основната функция \ n", i);
пауза (); // изчакваме, докато сигналът бъде обработен

 
връщане 0;

В екранната снимка на изхода на Пример5.° С, можем да видим, че когато потребителят напише Ctrl + C, алармата се нулира за 5 секунди. В тази програма сме използвали само една функция манипулатор за два различни сигнала, но във функцията манипулатор е проверено дали за кой сигнал се извиква функцията манипулатор.

Заключение:

И така, видяхме как функцията за аларма може да бъде настроена за задействане на сигнал, как да нулирате алармата, как да отмените вече планираната аларма.

Урок за OpenTTD
OpenTTD е една от най-популярните бизнес симулационни игри там. В тази игра трябва да създадете прекрасен транспортен бизнес. Въпреки това, ще започне...
SuperTuxKart за Linux
SuperTuxKart е страхотно заглавие, създадено да ви предостави безплатно изживяването на Mario Kart във вашата Linux система. Играта е доста предизвика...
Урок за битка за Уеснот
Битката за Уеснот е една от най-популярните стратегически игри с отворен код, които можете да играете по това време. Тази игра не само се разработва о...