Comment comparer les deux horodateurs en C?
Je suis en train d'écrire un socket programme qui gère les files d'attente FIFO pour deux prises d'entrée. Lorsque vous décidez de la file d'attente de service, le programme tire la plus récente d'horodatage de chaque file d'attente.
J'ai besoin d'une méthode fiable pour la comparaison de deux timeval
des structures. J'ai essayé d'utiliser timercmp()
, mais ma version de gcc ne le supporte pas, et la documentation indique que la fonction n'est pas conforme à POSIX.
Que dois-je faire?
OriginalL'auteur Vishal Kotcherlakota | 2009-12-07
Vous devez vous connecter pour publier un commentaire.
googler
timeval
donner ce premier résultat. À partir de cette page:Il est souvent nécessaire de soustraire deux valeurs de type struct timeval ou struct timespec. Ici est la meilleure façon de le faire. Il fonctionne même sur certaines particulier les systèmes d'exploitation où le tv_sec membre a un type non signé.
Pour clarifier, j'ai réalisé que la timevals ont été initialisés pour avoir
tv_sec
ettv_usec
valeurs de 0. À l'aide degettimeofday()
d'initialiser correctement les files d'attente fixe le problème. Merci pour le soutien. =)2AShelly, je voudrais ajouter que, à mon humble avis il est préférable de modifier la deuxième condition, la façon suivante
x->tv_usec - y->tv_usec >= 1000000
afin de convertir le temps comme5/1000000
à6/0
.Juste pour que les autres ne pas se faire frapper par le même bug que j'ai fait, sachez que l'appel de cette fonction a une 50-50 chance de modifier le paramètre y, causant la timeval passée dans être modifié.
Wudn pas de ` int ns = (y->tv_usec - x->tv_usec) / 1000000 + 1;` cette opération toujours mettre
nsec = 1
depuis deux y->tv_usec et x->tv_usec sont moins de 1 e6OriginalL'auteur AShelly
timercmp()
est juste une macro dans la libc (sys/time.h):Si vous avez besoin d'
timersub()
:OriginalL'auteur Gonzalo
C'est un peu différent, mais je pense que l'illustre clairement la logique.
Je travaille sur quelques MSP430 code en C, et l'horodatage structure très similaire à timeval, mais avec nsecs au lieu de usecs.
Ce code permet de tout positif, alors unsigned ints va fonctionner très bien, et évite les débordements (je pense). Il également ne pas modifier le timestamp/timevals être transmis, sauf le résultat bien sûr.
1000000000
(ou1000*1000*1000
si vous préférez) plutôt qu'à virgule flottante1e9
, que l'ancien est susceptible d'être plus efficace.OriginalL'auteur travc