English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
タイマーTimerの応用範囲は非常に広く、Linuxでは以下のような方法があります:
1、sleep()とusleep()を使用して
その中でsleepの精度は1秒、usleepの精度は1微妙、具体的コードは省略します。この方法の欠点は明らかで、Linuxシステムでは、sleepのような関数は精度を保証できません。特にシステムの負荷が大きい場合、sleepは通常タイムアウト現象が発生します。
2、シグナルマシンSIGALRMを使用して + alarm()
この方法の精度は以下となります1秒、その中で*nixシステムのシグナルマシンキック機構、まずシグナルマシンSIGALRMのハンドラを登録し、alarm()を呼び出し、タイマーの長さを設定する、以下のようにコードを記述します:
#include <stdio.h> #include <signal.h> void timer(int sig) { if(SIGALRM == sig) { printf("timer\n"); alarm(1); //タイマーを設定し続ける } return ; } int main() { signal(SIGALRM, timer); //シグナルと関数を関連付ける alarm(1); //タイマーをトリガーする getchar(); return 0; }
alarm方式は良いが、最初に以下よりも低くはならない1秒の精度で
3、RTC機構を使用して
RTC機構はシステムハードウェアが提供するReal Time Clock機構を利用し、RTCハードウェア/dev/rtc,通过ioctl()设置RTC频率,代码如下:
#include <stdio.h> #include <linux/rtc.h> #include <sys/ioctl.h> #include <sys/time.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <stdlib.h> 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); } /*設定周波数として 4Hz*/ if(ioctl(fd, RTC_IRQP_SET, 1) < 0) { perror("ioctl(RTC_IRQP_SET)"); close(fd); exit(errno); } /* 周期中断启用 */ 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("timer\n"); } /* 周期中断禁用 */ ioctl(fd, RTC_PIE_OFF, 0); close(fd); return 0; }
この方法は非常に便利で、システムのハードウェアが提供するRTCを使用し、精度を調整でき、非常に高くです。
4を使用して、select()
この方法はAPUEの神書を見たときに見つけました。方法は比較的珍しく、select()を使用してタイマーを設定します;原理はselect()メソッドの第5の引数、最初の引数を0に設定し、3つのファイルディスクリプタセットをNULLに設定します、次の5の引数が時間構造体です。以下のコードです:
#include <sys/time.h> #include <sys/select.h> #include <time.h> #include <stdio.h> /*seconds: 秒; mseconds: 微秒*/ void setTimer(int seconds, int mseconds) { struct timeval temp; temp.tv_sec = seconds; temp.tv_usec = mseconds; select(0, NULL, NULL, NULL, &temp); printf("timer\n"); return ; } int main() { int i; for(i = 0 ; i< 100; i++) setTimer(1, 0); return 0; }
この方法の精度はミクロ秒レベルに達します。ネットワークにはselect()ベースのマルチスレッドタイマーがたくさんあります。これは、select()の安定性が非常に良いことを示しています。
まとめ:システムの要件が低い場合、シンプルなsleep()を使用を検討してください。なぜなら、一行のコードで解決できるからです;システムが高精度を要求する場合は、RTCメカニズムとselect()メカニズムを検討してください。
これで、編集者が皆さんに提供したLinuxでタイマーTimerを実現する方法のいくつかのまとめがすべて終わりました。皆さん、サポートして、叫び教程を応援してください~