Синтаксис
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 секунд. В этой программе мы использовали только одну функцию-обработчик для двух разных сигналов, но в функции-обработчике было проверено, для какого сигнала вызывается функция-обработчик.
Заключение:
Итак, мы увидели, как можно настроить функцию тревоги для срабатывания сигнала, как сбросить тревогу, как отменить уже запланированную тревогу.