Heim  >  Artikel  >  System-Tutorial  >  Verschiedene Anwendungsmethoden des Timers sowie Vor- und Nachteile unter Linux

Verschiedene Anwendungsmethoden des Timers sowie Vor- und Nachteile unter Linux

WBOY
WBOYOriginal
2024-07-19 15:52:09855Durchsuche

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

Timer-Anwendungsszenarien sind sehr vielfältig. Unter Linux Linux-Anwendungs-Timer gibt es folgende Möglichkeiten:

1 Hongqi Linux-Desktop-Version mit Sleep() und Usleep()

Die Genauigkeit des Schlafs beträgt eine Sekunde und die Genauigkeit des US-Schlafs beträgt 1 Mikrosekunde. Der spezifische Code wird nicht geschrieben. Die Nachteile der Verwendung dieser Techniken liegen auf der Hand. In Linux-Systemen können Schlaffunktionen keine Genauigkeit garantieren. Insbesondere wenn die Systemlast relativ hoch ist, kommt es normalerweise zu Zeitüberschreitungen.

2. Verwenden Sie das Semaphor SIGALRM+alarm()

Die Genauigkeit dieser Methoden kann eine Sekunde erreichen. Sie verwenden den Semaphor-Mechanismus des *nix-Systems. Registrieren Sie zunächst die Semaphor-SIGALRM-Verarbeitungsfunktion, rufen Sie alarm() auf und legen Sie die Timing-Breite fest

#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 应用定时器

Obwohl die Alarmmethode sehr gut ist, ist es schwierig, zunächst eine Genauigkeit von mehr als einer Sekunde zu erreichen.

3. Verwenden Sie den RTC-Mechanismus

Der RTC-Mechanismus verwendet den von der Systemhardware bereitgestellten RealTimeClock-Mechanismus, liest die RTC-Hardware /dev/rtc und legt die RTC-Frequenz über ioctl() fest. Der Code lautet wie folgt:

#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;
}

Diese Methoden sind relativ praktisch und nutzen die von der Systemhardware bereitgestellte RTC. Die Genauigkeit ist einstellbar und extrem hoch.

4, verwenden Sie select()

Ich habe diese Methoden beim Lesen des APUE-Zauberbuchs gehört, und die Fähigkeiten sind relativ nischenmäßig.

Linux-Anwendungs-Timer. Linux-gängige Befehle: Verwenden Sie select(), um den Timer einzustellen , der erste Parameter ist auf 0 gesetzt, die drei Dateideskriptorsätze sind alle auf NULL gesetzt, der fünfte Parameter ist die Zeitstruktur, der Code lautet wie folgt:

#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;
}

Die Genauigkeit dieser Techniken kann ein subtiles Niveau erreichen. Es gibt viele auf select() basierende Multithread-Timer, was zeigt, dass die Stabilität von select() immer noch sehr gut ist.

Zusammenfassung: Wenn die Systemanforderungen relativ niedrig sind, können Sie die Verwendung eines einfachen Sleep() in Betracht ziehen. Wenn das System jedoch relativ hohe Genauigkeitsanforderungen hat, können Sie den RTC-Mechanismus und den Select()-Mechanismus in Betracht ziehen .

Das obige ist der detaillierte Inhalt vonVerschiedene Anwendungsmethoden des Timers sowie Vor- und Nachteile unter Linux. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn