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

Как использовать SIGALRM и функцию будильника на языке C?

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

Синтаксис

unsigned int alarm (беззнаковое целое число секунд)

Функция определена в unistd.час заголовочный файл.

Аргументы

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

В аварийная сигнализация() функция вернет ненулевое значение, если ранее был установлен другой сигнал тревоги, и значение представляет собой количество секунд, оставшихся до предыдущего запланированного сигнала тревоги из-за доставленного. Иначе аварийная сигнализация() вернет ноль.

Пример1.c:

#включать
#включать
#включать
 
void sig_handler (int signum)
 
printf ("Функция внутреннего обработчика \ n");

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

возврат 0;

На скриншоте вывода Пример1.c, программа запускается с использованием команды time, так что мы можем получить обзор времени выполнения программы. Мы заметили, что в основной функции мы вызываем аварийная сигнализация() функция, запланированная на 2 секунды. Итак, цикл for выполняется, через 2 секунды вызывается функция sig_handler и выполнение основной функции приостанавливается. После выполнения функции sig_handler в основной функции возобновляется выполнение цикла. Здесь мы используем функцию сна для задержки, чтобы мы могли понять поток выполнения. Цикл for - это бесконечный цикл, когда мы нажимаем клавишу прерывания (Ctrl + C), выполнение останавливается.

Создание SIGALRM с использованием сигнал () функция не может быть сложена. Единственный SIGALRM генерация может быть запланирована. Последовательные звонки сигнал () функция сброса будильника вызывающего процесса.

Пример2.c:

#включать
#включать
#включать
 
void sig_handler (int signum)
 
printf ("Функция внутреннего обработчика \ n");

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

 
возврат 0;

На скриншоте вывода Пример2.c, мы можем видеть, что программа выполнила более 7 секунд, но первый сигнал тревоги, который был запланирован через 4 секунды, не вызывает функцию обработчика. Второй сигнал тревоги, который был запланирован через 1 секунду, сбрасывает сигнал тревоги.

Если значение аргумента секунд равно нулю, то любой ранее сделанный запрос тревоги отменяется.

Пример 3.c:

#включать
#включать
#включать
 
void sig_handler (int signum)
 
printf ("Функция внутреннего обработчика \ n");

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

 
возврат 0;

На скриншоте вывода Пример 3.c, мы видим, что первая тревога, которая была запланирована через 2 секунды, отменяется из-за второй тревоги на 0 секунд.

В Пример 4.c мы увидим, как непрерывно мы можем установить будильник на каждые 2 секунды.

Пример 4.c:

#включать
#включать
#включать
 
void sig_handler (int signum)
 
printf ("Функция внутреннего обработчика \ n");
 
сигнализация (2); // Планируем новый будильник через 2 секунды

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

 
возврат 0;

На скриншоте вывода Пример 4.c, мы видим, что сигнал тревоги подается каждые 2 секунды. Сбрасываем будильник в функции sig_handler.

В Пример 5.c мы увидим, как мы можем отложить уже запланированный сигнал тревоги. Мы будем использовать сигнал SIGINT для прерывания. Когда пользователь вводит Ctrl + C на клавиатуре, SIGINT сигнал будет генерировать.

Пример 5.c:

#включать
#включать
#включать
 
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 секунды
 
for (int i = 1 ;; i ++)
 
printf ("% d: внутри основной функции \ n", i);
Пауза(); // ожидаем обработки сигнала

 
возврат 0;

На скриншоте вывода Пример 5.c, мы видим, что когда пользователь нажимает Ctrl + C, тревога сбрасывается через 5 секунд. В этой программе мы использовали только одну функцию-обработчик для двух разных сигналов, но в функции-обработчике было проверено, для какого сигнала вызывается функция-обработчик.

Заключение:

Итак, мы увидели, как можно настроить функцию тревоги для срабатывания сигнала, как сбросить тревогу, как отменить уже запланированную тревогу.

Порты коммерческих игровых движков с открытым исходным кодом
Бесплатные игры с открытым исходным кодом и кроссплатформенные версии игрового движка можно использовать для игры как в старые, так и в некоторые из с...
Лучшие игры с командной строкой для Linux
Командная строка - не только ваш главный союзник при использовании Linux - она ​​также может быть источником развлечений, потому что вы можете использ...
Лучшие приложения для сопоставления геймпадов для Linux
Если вам нравится играть в игры на Linux с помощью геймпада вместо стандартной системы ввода с клавиатуры и мыши, для вас есть несколько полезных прил...