Utilisez l'interface de sélection pour écrire un délai de haute précision.
sélectionnez l'interface
int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);
principe
- Utilisez le paramètre timeout de select pour implémenter une minuterie;
- Définissez la valeur de timeval et définissez les autres paramètres sur NULL, select quittera lorsque le temps interne sera écoulé.
Exemple
#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);
}
Remarque
- La résolution de retard prise en charge par le noyau ne peut généralement pas atteindre le niveau de la microseconde;
- En raison du retard de la planification du noyau;
- La résolution du noyau est généralement un multiple de 10 ms.