English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Применение таймера 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. Надеюсь, что вы поддержите и аплодируйте учебнику~