Während des Datenkommunikationsprozesses werden Sie auf Formatanforderungen für die Datensendezeit stoßen. Um unterschiedliche Timer entsprechend den tatsächlichen Anforderungen in der Anwendung auszuwählen, müssen daher die Eigenschaften mehrerer Anwendungs-Timer berücksichtigt werden.
Timer-Artikelreferenz
Generell ja,
1. Schlaf, Uschlaf und Nanoschlaf
sleep() und nanosleep() bewirken beide, dass der Prozess eine Zeit lang schläft, bevor er aufgeweckt wird, und ihre Implementierungen sind völlig unterschiedlich.
Linux stellt den Systemaufruf „sleep()“ nicht in der Bibliotheksfunktion bereit. Er legt die Meldezeit durch den Aufruf von „alarm()“ fest und ruft „sigsuspend()“ auf, um den Prozess beim Signal „sleep()“ anzuhalten. kann nur bis zur zweiten Ebene genau sein.
nanosleep() ist ein Systemaufruf in LinuxLinux-Timer-Genauigkeit Er wird mithilfe eines Timers implementiert. Dieser Aufruf bewirkt, dass der aufrufende Prozess in den Ruhezustand versetzt wird, und fügt der Timer-Warteschlange einen Timer hinzu. Startzeit und die nach dem Aufwecken ausgeführten Funktionen. Die durch nanosleep() hinzugefügte Ausführungsfunktion des Timers vervollständigt nur die Funktion des Aufweckens des aktuellen Prozesses. Das System erkennt diese Warteschlangen regelmäßig durch einen bestimmten Mechanismus (z. B. nachdem es durch einen Systemaufruf im Kern gefangen wurde und vor der Rückkehr vom Kern in den Benutzermodus überprüft werden muss, ob die Zeitscheibe des aktuellen Prozesses erschöpft ist). Wenn dies der Fall ist, rufen Sie die Funktion „schedule()“ auf, um die Timer-Warteschlange neu zu planen. Diese Erkennung erfolgt auch, bevor der langsame Interrupt zurückkehrt wird ausgeführt, um den aufrufenden Prozess aufzuwecken. Da die Systemzeitscheibe möglicherweise verloren geht, ist die Genauigkeit von nanosleep () tatsächlich nicht sehr hoch.
alarm() wird auch vom Red Flag Linux-Betriebssystem über einen Timer implementiert, und seine Genauigkeit ist nur auf der zweiten Ebene genau. Darüber hinaus besteht die von ihm festgelegte Timer-Ausführungsfunktion darin, das SIGALRM-Signal an den aktuellen Prozess zu senden angegebene Zeit.
2. Verwenden Sie das Semaphor SIGALRM+alarm()
Obwohl die Alarmmethode sehr gut ist, kann die Genauigkeit dieser Methoden eine Sekunde erreichen, es ist jedoch schwierig, eine Genauigkeit von mehr als einer Sekunde zu erreichen. Der Semaphor-Mechanismus des *nix-Systems wird verwendet. Registrieren Sie zunächst die Semaphor-SIGALRM-Verarbeitungsfunktion, rufen Sie alarm() auf und legen Sie die Timing-Breite fest
//设置一个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. Verwenden Sie den RTC-Mechanismus
Der
RTC-Mechanismus nutzt den von der Systemhardware bereitgestellten RealTimeClock-Mechanismus, indem er die RTC-Hardware /dev/rtc liest und die RTC-Frequenz über ioctl() einstellt. Diese Methoden sind bequemer Die von der Systemhardware bereitgestellte RTC, die Genauigkeit ist einstellbar und der besonders hohe 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; }
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和进程的调度,等等。。。。
Das obige ist der detaillierte Inhalt vonSchock! Wussten Sie, dass Timer tatsächlich so viele Funktionen haben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!