Maison  >  Article  >  Tutoriel système  >  Timer Les différentes méthodes d'application de Timer et ses avantages et inconvénients sous Linux

Timer Les différentes méthodes d'application de Timer et ses avantages et inconvénients sous Linux

WBOY
WBOYoriginal
2024-07-19 15:52:09855parcourir

定时器 Timer 在 Linux 下的多种应用方法及优缺点

Les scénarios d'application de minuterie sont très larges Sous Linux linux application timer, il existe les manières suivantes :

1 Version de bureau Hongqi Linux, utilisant sleep() et usleep()

La précision du sommeil est d'une seconde et la précision du sommeil est de 1 microseconde. Le code spécifique ne sera pas écrit. Les inconvénients de l'utilisation de ces techniques sont évidents. Dans les systèmes Linux, les fonctions de mise en veille ne peuvent pas garantir la précision. Surtout lorsque la charge du système est relativement lourde, la mise en veille expire généralement.

2. Utilisez le sémaphore SIGALRM+alarm()

La précision de ces méthodes peut atteindre une seconde. Elles utilisent le mécanisme de sémaphore du système *nix. Tout d'abord, enregistrez la fonction de traitement du sémaphore SIGALRM, appelez alarm() et définissez la largeur de synchronisation.

#include 
#include 
void timer(int sig)
{
if(SIGALRM == sig)
{
printf("timern");
alarm(1); //we contimue set the timer
}
return ;
}
int main()
{
signal(SIGALRM, timer); //relate the signal and function
alarm(1); //trigger the timer
getchar();
return 0;
}

应用定时器设计电子钟_应用定时器2安卓版下载_linux 应用定时器

Bien que la méthode d'alarme soit très bonne, il est difficile d'obtenir d'abord une précision supérieure à une seconde.

3. Utilisez le mécanisme RTC

Le mécanisme RTC utilise le mécanisme RealTimeClock fourni par le matériel du système, lit le matériel RTC /dev/rtc et définit la fréquence RTC via ioctl().

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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);
}
/*Set the freq as 4Hz*/
if(ioctl(fd, RTC_IRQP_SET, 1) < 0)
{
perror("ioctl(RTC_IRQP_SET)");
close(fd);
exit(errno);
}
/* Enable periodic interrupts */
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("timern");
}
/* Disable periodic interrupts */
ioctl(fd, RTC_PIE_OFF, 0);
close(fd);
return 0;
}

Ces méthodes sont relativement pratiques et utilisent le RTC fourni par le matériel du système. La précision est réglable et extrêmement élevée.

4, utilisez select()

J'ai entendu ces méthodes en lisant le livre magique APUE, et les compétences sont relativement spécialisées

Minuterie d'application Linux

Commandes communes Linux, utilisez select() pour régler la minuterie, le principe est basé sur le 5ème paramètre de la méthode select() ; , le premier paramètre est mis à 0, les trois ensembles de descripteurs de fichiers sont tous mis à NULL, le cinquième paramètre est la structure temporelle, le code est le suivant :

#include 
#include 
#include 
#include 
/*seconds: the seconds; mseconds: the micro seconds*/
void setTimer(int seconds, int mseconds)
{
struct timeval temp;
temp.tv_sec = seconds;
temp.tv_usec = mseconds;
select(0, NULL, NULL, NULL, &temp);
printf("timern");
return ;
}
int main()
{
int i;
for(i = 0 ; i < 100; i++)
setTimer(1, 0);
return 0;
}

La précision de ces techniques peut atteindre un niveau subtil. Il existe de nombreux timers multithread basés sur select() sur Internet, ce qui montre que la stabilité de select() est toujours très bonne.

Résumé : si la configuration système requise est relativement faible, vous pouvez envisager d'utiliser un simple sleep(), bien qu'une seule ligne de code puisse le résoudre ; si le système a des exigences de précision relativement élevées, vous pouvez envisager le mécanisme RTC et le mécanisme select(). .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn