Utilice la interfaz de selección para escribir un retraso de alta precisión.
seleccionar interfaz
int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);
principio
- Utilice el parámetro de tiempo de espera de seleccionar para implementar un temporizador;
- Establezca el valor de timeval y establezca otros parámetros en NULL; la selección saldrá cuando se agote el tiempo interno.
Ejemplo
#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);
}
Nota
- La resolución de retardo admitida por el kernel generalmente no puede alcanzar el nivel de microsegundos;
- Debido al retraso de la programación del kernel;
- La resolución del kernel es generalmente un múltiplo de 10 ms.