Rumah  >  Artikel  >  Tutorial sistem  >  Pemasa Pemasa pelbagai kaedah aplikasi dan kelebihan dan kekurangan di bawah Linux

Pemasa Pemasa pelbagai kaedah aplikasi dan kelebihan dan kekurangan di bawah Linux

WBOY
WBOYasal
2024-07-19 15:52:09855semak imbas

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

Senario aplikasi pemasa sangat luas Di bawah Linux pemasa aplikasi linux, terdapat cara berikut:

1 versi desktop Hongqi Linux, menggunakan sleep() dan usleep()

Ketepatan tidur adalah satu saat, dan ketepatan tidur adalah 1 mikrosaat Kod khusus tidak akan ditulis. Kelemahan menggunakan teknik ini adalah jelas Dalam sistem Linux, fungsi tidur tidak dapat menjamin ketepatan Terutama apabila beban sistem agak berat, tidur biasanya tamat.

2 Gunakan semaphore SIGALRM+alarm()

Ketepatan kaedah ini boleh mencapai satu saat Mereka menggunakan mekanisme semaphore sistem *nix Pertama, daftarkan fungsi pemprosesan SIGALRM semaphore, penggera panggilan(), dan tetapkan lebar masa adalah seperti berikut:

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

Walaupun kaedah penggera sangat baik, sukar untuk mencapai ketepatan lebih tinggi daripada satu saat dahulu.

3. Gunakan mekanisme RTC

Mekanisme RTC menggunakan mekanisme RealTimeClock yang disediakan oleh perkakasan sistem, membaca perkakasan RTC /dev/rtc, dan menetapkan frekuensi RTC melalui 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;
}

Kaedah ini agak mudah dan menggunakan RTC yang disediakan oleh perkakasan sistem Ketepatan boleh laras dan sangat tinggi.

4, gunakan pilih()

Saya mendengar kaedah ini semasa membaca buku ajaib APUE, dan kemahirannya agak khusus

Pemasa aplikasi Linux Arahan biasa Linux, gunakan pilih() untuk menetapkan pemasa prinsipnya adalah berdasarkan parameter ke-5 kaedah pilih(). , parameter pertama ditetapkan kepada 0, tiga set deskriptor fail semuanya ditetapkan kepada NULL, parameter kelima ialah struktur masa, kodnya adalah seperti berikut:

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

Ketepatan teknik ini boleh mencapai tahap yang halus Terdapat banyak pemasa berbilang benang berdasarkan select() di Internet, yang menunjukkan bahawa kestabilan select() masih sangat baik.

Ringkasan: Jika keperluan sistem agak rendah, anda boleh mempertimbangkan untuk menggunakan sleep() mudah, walaupun satu baris kod boleh menyelesaikannya jika sistem mempunyai keperluan ketepatan yang agak tinggi, anda boleh mempertimbangkan mekanisme RTC dan pilih() mekanisme .

Atas ialah kandungan terperinci Pemasa Pemasa pelbagai kaedah aplikasi dan kelebihan dan kekurangan di bawah Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn