selectインターフェースを使用して、高精度の遅延を書き込みます。
インターフェイスを選択
int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);
原理
- selectのtimeoutパラメーターを使用して、タイマーを実装します。
- timevalの値を設定し、他のパラメーターをNULLに設定すると、内部時間がなくなるとselectが終了します。
例
#include <stdio.h>
#include <sys/time.h>
int main()
{
struct timeval tv;
while(1)
{
tv.tv_sec = 1; // 定时1秒
tv.tv_usec = 0;
switch(select(0, NULL, NULL, NULL, &tv))
{
case -1: // 错误
printf("Error!\n");
break;
case 0: //超时
printf("timeout expires.\n");
break;
default:
printf("default\n");
break;
}
}
return 0;
}
void usleep(unsigned long usec)
{
struct timeval tv;
tv.tv_sec = usec / 1000000;
tv.tv_usec = usec % 1000000;
int err;
do {
err = select(0, NULL, NULL, NULL, &tv);
} while(err < 0 && errno == EINTR);
}
注意
- カーネルでサポートされている遅延解決は、通常、マイクロ秒レベルに達することはできません。
- カーネルスケジューリングの遅延のため。
- カーネルの解像度は通常10msの倍数です。