8.13. Функция setitimer(): задание интервальных таймеров
8.13. Функция setitimer(): задание интервальных таймеров
Функция setitimer() является обобщением системного вызова alarm(). Она планирует доставку сигнала по истечении заданного промежутка времени.
С помощью функции setitimer() можно создавать таймеры трех типов.
? ITIMER_REAL. По истечении указанного времени процессу посылается сигнал SIGALRM.
? ITIMER_VIRTUAL. После того как процесс отработал требуемое время, ему посылается сигнал SIGVTALRM. Время, когда процесс не выполнялся (работало ядро или другой процесс), не учитывается.
? ITIMER_PROF. По истечении указанного времени процессу посылается сигнал SIGPROF. Учитывается время выполнения самого процесса, а также запускаемых в нем системных вызовов.
Код таймера задается в первом аргументе функции setitimer(). Второй аргумент — это указатель на структуру типа itimerval, содержащую параметры таймера. Третий аргумент либо равен NULL, либо является указателем на другую структуру itimerval, куда будут записаны прежние параметры таймера.
В структуре itimerval два поля.
? it_value. Здесь находится структура типа timeval, где записано время отправки сигнала. Если это поле равно нулю, таймер отменяется.
? it_interval. Это еще одна структура timeval, определяющая, что произойдет после отправки первого сигнала. Если она равна нулю, таймер будет отменен. В противном случае здесь записан интервал генерирования сигналов.
Структура timeval была описана в разделе 8.7. "Функция gettimeofday(): системные часы"
В листинге 8.11 показано, как с помощью функции setitimer() отслеживать выполнение программы. Таймер настроен на интервал 250 мс, по истечении которого генерируется сигнал SIGVTALRM.
Листинг 8.11. (itimer.c) Пример создания таймера
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
void timer_handler(int signum) {
static int count = 0;
printf("timer expired %d times ", ++count);
}
int main() {
struct sigaction sa;
struct itimerval timer;
/* Назначение функции timer_handler обработчиком сигнала
SIGVTALRM. */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = &timer_handler;
sigaction(SIGVTALRM, &sa, NULL);
/* Таймер сработает через 250 миллисекунд... */
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 250000;
/* ... и будет продолжать активизироваться каждые 250
миллисекунд. */
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 250000;
/* Запуск виртуального таймера. Он подсчитывает фактическое
время работы процесса. */
setitimer(ITIMER_VIRTUAL, &timer, NULL);
/* Переход в бесконечный цикл. */
while (1);
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Использование таймеров
Использование таймеров Таймеры представлены с помощью структур timer_list, которая определена в файле <linux/timer.h> следующим образом.struct timer_list { struct list_head entry; /* таймеры хранятся в связанном списке */ unsigned long expires; /* время окончание срока ожидания в
Реализация таймеров
Реализация таймеров Ядро выполняет обработчики таймеров в контексте обработчика отложенного прерывания после завершения обработки прерывания таймера. Обработчик прерывания таймера вызывает функцию update_process_times(), которая в свою очередь вызывает функцию run_local_timers(),
Типы таймеров
Типы таймеров Таймер, работу которого мы только что обсудили, называют относительным таймером. Для такого таймера период ожидания задается относительно текущего времени. Если бы вы пожелали задержать выполнение вашего потока до 12 часов 4 минут 33 секунд EDT (Eastern Daylight Time —
Применение таймеров
Применение таймеров Изучив все красоты теории, давайте теперь переключим наше внимание на конкретные образцы кода, чтобы посмотреть, что можно сделать при помощи таймеров.Чтобы работать с таймером, вам потребуется:1. Создать объект типа «таймер».2. Выбрать схему
18.2. Использование таймеров
18.2. Использование таймеров Таймер — это простое средство для указаний определенной точки в будущем, в которой должно произойти некоторое событие. Вместо того чтобы циклически запрашивать текущее время и проводить лишние растраты циклов центрального процессора,
Программирование с помощью таймеров обратного вызова
Программирование с помощью таймеров обратного вызова Во многих приложениях возникает необходимость вызывать конкретный метод через регулярные промежутки времени. Например, в одном приложении может потребоваться отображение текущего времени в строке состояния с
Совет 37. Используйте accumulate или for_each для обобщения интервальных данных
Совет 37. Используйте accumulate или for_each для обобщения интервальных данных Иногда возникает необходимость свести целый интервал к одному числу или, в более общем случае, к одному объекту. Для стандартных задач обобщения существуют специальные алгоритмы. Так, алгоритм count
7.14. Создание таймеров
7.14. Создание таймеров Постановка задачи Требуется многократно выполнять определенную задачу после заданной задержки. Например, вы хотите обновлять вид на экране устройства каждую секунду, пока работает ваше
7.17. Выход из потоков и таймеров
7.17. Выход из потоков и таймеров Постановка задачи Требуется остановить поток или таймер либо не допустить его повторного
8.9. Функция mprotect(): задание прав доступа к памяти
8.9. Функция mprotect(): задание прав доступа к памяти В разделе 5.3, "Отображение файлов в памяти", рассказывалось о том, как осуществляется отображение файла в памяти. Вспомните, что третьим аргументом функции mmap() является битовое объединение флагов доступа: флаги PROT_READ, PROT_WRITE и
Использование таймеров
Использование таймеров Во многих случаях нужно выполнять какое-либо действие через равные промежутки времени. Это может понадобиться, например, для создания анимации с помощью сценариев ActionScript или для обновления информации, взятой с удаленного сервера. Для таких задач