Semasa proses komunikasi data, anda akan menghadapi keperluan format untuk masa penghantaran data. Oleh itu, untuk memilih pemasa yang berbeza mengikut keperluan sebenar dalam aplikasi, adalah perlu untuk mempertimbangkan ciri-ciri beberapa pemasa aplikasi.
Rujukan artikel pemasa
Secara umumnya, ya,
1. tidur, usleep dan nanosleep
sleep() dan nanosleep() kedua-duanya menyebabkan proses tidur untuk tempoh masa sebelum dikejutkan, dan pelaksanaannya berbeza sama sekali.
Linux tidak menyediakan sleep() panggilan sistem dilaksanakan dalam fungsi perpustakaan Ia menetapkan masa pelaporan dengan memanggil penggera(), dan memanggil sigsuspend() untuk menangguhkan proses pada isyarat SIGALARM. hanya boleh tepat ke tahap kedua.
nanosleep() ialah panggilan sistem dalam Linuxlinux ketepatan pemasa Panggilan ini menyebabkan proses panggilan tidur dan menambah pemasa jenis pemasa pada baris gilir pemasa dalam struktur senarai masa. masa sehingga dan fungsi yang dilaksanakan selepas bangun tidur Fungsi pelaksanaan pemasa yang ditambahkan melalui nanosleep() hanya melengkapkan fungsi membangkitkan proses semasa. Sistem sentiasa mengesan baris gilir ini melalui mekanisme tertentu (contohnya, selepas terperangkap dalam teras melalui panggilan sistem dan sebelum kembali dari teras kepada mod pengguna, ia mesti menyemak sama ada potongan masa proses semasa telah habis, dan jika ya, panggil fungsi schedule() untuk menjadualkan semula , baris gilir pemasa akan dikesan dalam fungsi ini, dan pengesanan ini juga akan dilakukan sebelum gangguan perlahan kembali jika masa pemasaan telah melebihi, fungsi yang ditentukan oleh pemasa akan dilaksanakan untuk membangkitkan proses panggilan. Malah, kerana kepingan masa sistem mungkin hilang, ketepatan nanosleep() tidak begitu tinggi.
alarm() juga dilaksanakan oleh sistem pengendalian Red Flag Linux melalui pemasa, dan ketepatannya hanya tepat ke tahap kedua Selain itu, fungsi pelaksanaan pemasa yang ditetapkannya adalah untuk menghantar isyarat SIGALRM kepada proses semasa di masa yang ditentukan.
2 Gunakan semaphore SIGALRM+alarm()
Walaupun kaedah penggera sangat baik, ketepatan kaedah ini boleh mencapai satu saat, tetapi sukar untuk mencapai ketepatan yang lebih tinggi daripada satu saat. Mekanisme semaphore sistem *nix digunakan Mula-mula, daftarkan fungsi pemprosesan SIGALRM semaphore, panggil penggera(), dan tetapkan lebar pemasaan adalah seperti berikut:
//设置一个1s延时信号,再注册一个 #include #include void timer(int sig) { if(SIGALRM == sig) { printf("timern"); alarm(1); //重新继续定时1s } return ; } int main() { signal(SIGALRM, timer); //注册安装信号 alarm(1); //触发定时器 getchar(); return 0; }
3. Gunakan mekanisme RTC
Mekanisme RTC menggunakan mekanisme RealTimeClock yang disediakan oleh perkakasan sistem, dengan membaca perkakasan RTC /dev/rtc, dan menetapkan frekuensi RTC melalui ioctl() Kaedah ini lebih mudah Ketepatan pemasa Linux, dengan bantuan RTC yang disediakan oleh perkakasan sistem, ketepatan Boleh Laras, dan kod yang sangat tinggi adalah seperti berikut:
#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 memerlukan sistem untuk mempunyai alat penciptaan cakera but Linux 1860 kami mempunyai dua RTC dalam LC1160 modul pengurusan kuasa digunakan, dan tiada sokongan untuk perkataan kawalan RTC_IRQP_SET dalam pemacu. Pemandu perlu ditambah kemudian.
4、使用select()
能精确到1us,目前精确定时的最流行方案。通过使用select(),来设置定时器;原理借助select()方式的第5个参数,第一个参数设置为0,三个文件描述符集都设置为NULL,第5个参数为时间结构体,代码如下:
#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 * 1000; select(0, NULL, NULL, NULL, &temp); printf("timern"); return ; } int main() { int i; for(i = 0 ; i < 100; i++) setTimer(1, 0); return 0; }
结果是,每隔1s复印一次,复印100次。
select定时器是阻塞的,在等待时间到来之前哪些都不做。要定时可以考虑再开一个线程来做。
最终,下层应用程序的定时器的京都是内核决定的,这几个定时器的使用方式,尽管理论上可以精确到微妙,虽然,我分别在微妙级测试的时侯,偏差还是很大的,取决于,当时的cpu和进程的调度,等等。。。。
Atas ialah kandungan terperinci terkejut! Pemasa sebenarnya mempunyai begitu banyak ciri, adakah anda tahu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!