English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Краткое изложение использования STL карты в C++

Применение таймера Timer очень широко, в Linux есть следующие методы:

1, использование sleep() и usleep()

Где точность sleep составляет 1 секунду, usleep точность составляет 1 мкс, конкретный код не будет написан. Недостатки этого метода очевидны, в системе Linux функции sleep не гарантируют точности, особенно при высокой нагрузке системы, sleep обычно имеет явление просрочки.

2, использование сигнала SIGALRM + alarm()

Такой способ точности достигает 1 секунды, он использует механизм семафоров системы *nix, сначала регистрирует обработчик сигнала SIGALRM, вызывает alarm(), устанавливает продолжительность таймера, код如下:

#include <stdio.h>
#include <signal.h>
void timer(int sig)
{
    if(SIGALRM == sig)
    {
        printf("timer\n");
        alarm(1);    //мы продолжаем устанавливать таймер
    }
    возврат;
}
int main()
{
    signal(SIGALRM, timer); //связать сигнал и функцию
    alarm(1);    //トリггер таймера
    getchar();
    возврат 0;
}

Аларм-метод虽然很好, но не может быть менее 1 секунды точности.

3. Использование механизма RTC

Механизм RTC использует механизм Real Time Clock, предоставляемый системой оборудования, через чтение RTC оборудования /dev/rtc, через ioctl() устанавливается частота RTC, код следующий:

#include <stdio.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
    unsigned long i = 0;
    unsigned long data = 0;
    int retval = 0;
    int fd = open("/dev/rtc", O_RDONLY);
    if(fd < 0)
    {
        perror("open");
        exit(errno);
    }
    /* Установить частоту как 4Гц */
    if(ioctl(fd, RTC_IRQP_SET, 1) < 0)
    {
        perror("ioctl(RTC_IRQP_SET)");
        close(fd);
        exit(errno);
    }
    /* Включить периодические прерывания */
    if(ioctl(fd, RTC_PIE_ON, 0) < 0)
    {
        perror("ioctl(RTC_PIE_ON)");
        close(fd);
        exit(errno);
    }
    for(i = 0; i < 100; i++)
    {
        if(read(fd, &data, sizeof(unsigned long)) < 0)
        {
            perror("read");
            close(fd);
            exit(errno);
        }
        printf("timer\n");
    }
    /* Отключить периодические прерывания */
    ioctl(fd, RTC_PIE_OFF, 0);
    close(fd);
    возврат 0;
}

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

4, использование select()

Этот метод я увидел в APUE神圣的书中, метод довольно редкий, он использует select() для настройки таймера; принцип использует пятый параметр метода select(), первый параметр устанавливается в 0, три набора файловых дескрипторов устанавливаются в NULL, пятым параметром является структура времени, код как follows:

#include <sys/time.h>
#include <sys/select.h>
#include <time.h>
#include <stdio.h>
/*seconds: секунды; mseconds: микросекунды*/
void setTimer(int seconds, int mseconds)
{
    struct timeval temp;
    temp.tv_sec = seconds;
    temp.tv_usec = mseconds;
    select(0, NULL, NULL, NULL, &temp);
    printf("timer\n");
    возврат;
}
int main()
{
    int i;
    for(i = 0 ; i < 100; i++)
        setTimer(1, 0);
    возврат 0;
}

Эта методика точность может достигать уровня микросекунды, в Интернете есть много многоthreaded таймеров на основе select(), что говорит о высокой стабильности select().

Резюме:Если требования к системе низки, можно использовать простую функцию sleep(), так как это всего один строковый код; если система требует высокой точности, можно рассмотреть механизм RTC и механизм select().

Вот и все, что я подготовил для вас о различных методах реализации таймера Timer под Linux. Надеюсь, что вы поддержите и аплодируйте учебнику~

Учебник по Elasticsearch