Это сверхконфигурируемый таймер для Linux, реализованный с использованием механизма epoll и новой возможности timerfd
: многозадачные, многопользовательские, многотаймерные задачи. Для создания таймера используется интерфейс TIMER_CREATE()
. Вы можете добавить в него десятки тысяч задач таймера с точностью до наносекунды и добавлять различные задачи одновременно!
Список исторических версий компонента и описания новых функций.
Компонент таймер состоит из следующих типов интерфейсов:
TIMER_CREATE()
, а также объявление этого экземпляра в других файлах с помощью TIMER_DECLARATION()
:TIMER_CREATE(name);
TIMER_DECLARATION(name);
TIMER_INIT()
, где name
— это имя экземпляра, а max
— максимальное количество задач таймера, которое будет отслеживаться; когда таймер больше не нужен, он может быть деинициализирован с помощью TIMER_DEINIT()
(выход из режима работы и освобождение всех ресурсов):TIMER_INIT(name, max);
TIMER_DEINIT(name);
``````c
TIMER_INIT(name, max);
TIMER_DEINIT(name);
TIMER_ADD(name, itimespec, repeat, cb, data, rb);
TIMER_DEL(name, timerfd);
Функция TIMER_ADD()
используется для добавления одной задачи таймера в экземпляр таймера name
. Его параметры описаны ниже:
itimespec
представляет время активации задачи таймера и периодичность выполнения, его структура имеет вид:struct timespec {
time_t tv_sec; // секунды
long tv_nsec; // наносекунды
};
struct itimerspec {
struct timespec it_value;
struct timespec it_interval;
};
```Здесь `it_value` представляет время истечения (относительное время). Если вы хотите определить циклическую задачу таймера, установите значение `it_interval`; если нет, то оба значения `it_interval` должны быть установлены равными нулю. Таким образом, первое истечение и последующие повторения могут иметь разное время.
- `repeat` — это количество повторений периодического таймера. Если значение равно **-1**, то задача будет выполняться бесконечно; если 0, то задача вообще не выполнится. Таким образом, `repeat` должен быть как минимум равен 1 или можно использовать -1;
- `cb` — это callback-функция, вызываемая при истечении времени работы таймера. Её тип: `void (*timer_callback_t)(void *data)`;
- `data` — это аргумент, передаваемый в callback-функцию таймера, имеет тип `void *`. Пользователи могут указать его как свой определённой структурой данных.
`TIMER_ADD()` добавление задачи в таймер успешно завершается возвратом нового файла-дескриптора таймера, при неудаче возвращается значение < 0. Возвращаемый файл-дескриптор может использоваться для удаления задачи таймера с помощью `TIMER_DEL()`.4. **Получение и очистка задач таймера**
TIMER_COUNT(name); TIMER_CLEAR(name);
`TIMER_COUNT(name)` используется для получения количества текущих задач таймера в экземпляре `name`; `TIMER_CLEAR(name)` используется для очистки всех задач таймера из экземпляра `name`.
### 2.2 Пример использования
Ниже приведён очень простой пример использования: создаются две задачи таймера, каждая первое истечение происходит через 3 секунды, а последующие — каждую секунду; но частота первой задачи составляет 8, а второй — 3; когда все задачи таймера истекут, можно нажать Enter для выхода:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "mt_timer.h"
void timeout_handle(void *arg)
{
printf("[%ld]:timeout1\n", time(NULL));
}
void timeout_handler(void *arg)
{
printf("[%ld]:timeout2\n", time(NULL));
}
TIMER_CREATE(test);
int main(void)
{
int timer;
struct itimerspec itimespec;
TIMER_INIT(test, 10);
itimespec.it_value.tv_sec = 3;
itimespec.it_value.tv_nsec = 0;
itimespec.it_interval.tv_sec = 1;
itimespec.it_interval.tv_nsec = 0;
timer = TIMER_ADD(test, &itimespec, 8, timeout_handle, NULL);
TIMER_ADD(test, &itimespec, 3, timeout_handler, NULL);
printf("[%ld]:timer_add : %d\n", time(NULL), TIMER_COUNT(test));
sleep(4); // getchar();
TIMER_DEL(test, timer);
printf("[%ld]:timer_del : %d\n", time(NULL), TIMER_COUNT(test));
TIMER_CLEAR(test);
printf("[%ld]:timer_clear : %d\n", time(NULL), TIMER_COUNT(test));
getchar();
TIMER_DEINIT(test);
return 0;
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )