Таймерные механизмы в C и Linux
Получите детальный контроль над функциями синхронизации с помощью Linux и C.
Механизмы таймера позволяют запланировать, чтобы ядро ОС уведомляло приложение по истечении заданного времени. Обычно вы будете использовать их, предоставляя две части информации. Во-первых, вам нужно указать, сколько времени должно пройти таймеру перед уведомлением. Во-вторых, вам нужно подготовить функцию обратного вызова, которая будет действовать при появлении этого уведомления.
Механизмы таймера в системах на базе Linux и Unix развивались для удовлетворения различных потребностей. Различные подходы могут помочь вам решить разные типы проблем. Однако вы часто будете видеть первую версиютревога()механизм все еще используется.
Функция будильника — это самый простой способ использования таймера; вот его прототип:
Используя этот метод, вы можете указать время только в целых секундах. По истечении времени операционная система отправляетСИГАЛРМ сигнал для вашего приложения. Чтобы обработать истечение таймера в вашем приложении, вам также следует определить функцию обратного вызова.
Вот пример функции-обработчика сигнала:
Этот код вызываетСИГАЛРМсигнал после1 второй. Если вы хотите увеличить задержку таймера до пяти секунд, просто позвонитесигнализация(5) вместо. Чтобы остановить таймер, передайте значение 0:сигнализация(0).
Когда время истечет, используемый вами таймер не будет периодически перезапускаться. Например, если вы хотите задержаться еще на секунду, вам следует перезапустить механизм, выполнив еще один вызовтревога().
Несмотря на простоту использования, этот метод имеет некоторые недостатки:
Сохраните приведенный выше пример кода каксигнализация.с . Когда вы скомпилируете и запустите его, программа вызоветtimer_callback функция через одну секунду. Затем он будет ждать оставшиеся две секунды из-заспать(3)линию, затем завершите.
Причина использования команды time — возможность видеть время. Но если посмотреть на результат, общее время бега составляет не три секунды. Это связано сСИГАЛРМсигнал отсигнализация(1)когда первая секунда истекла, асистемный вызов вызванное работой функции Sleep(3). Когда этот сигнал поступает, он прерывает системный вызов, инициированный дляспать(3).
Механизм интервального таймера впервые появился в версии 4.2 BSD. Позже он был стандартизирован POSIX. Его основные преимущества перед традиционнымитревога()основанный на таймере метод:
Прототипы функций, используемые для операций интервального таймера, следующие:
Если вы хотите настроить интервальный таймер, вам нужно будет использоватьитимервал структура. Вам нужно будет передать значение, используя эту структуру в качестве второго аргументанеделяфункция.
Например, интервальный таймер, который будет уведомлять ваше приложение в течение 1 секунды, а затем каждые 300 миллисекунд, можно настроить следующим образом:
Если перед установкой новых значений активен интервальный таймер, его значения передаются по адресу переменнойитимервалтип, присвоенный третьему параметру функции.
Вы можете настроить три различных типа таймеров с помощью механизма интервального таймера. Укажите тип таймера в первом параметреsettimer():
Тип таймера
Сигнал
Объяснение
ITIMER_REAL
СИГАЛРМ
Независимость от времени, затраченного приложением, рассчитывается по общему затраченному времени.
ITIMER_VIRTUAL
СИГВТАЛРМ
Рассчитывается за время работы приложения только в пользовательском режиме.
ITIMER_PROF
СИГПРОФ
Рассчитывается по сумме времени, проведенного приложением в пользовательском и системном режимах.
Из этой таблицы вы можете видеть, чтоITIMER_REALтип отправляетСИГАЛРМсигнал, как итревога()функция.
Использование интервального таймера и