fonction poll() en C sous linux - C - Programmation
Marsh Posté le 22-09-2007 à 18:06:09
La fonction poll() fonctionne de la manière suivante :
1. Regarde si l'état interrogé est atteint ou non.
Par exemple, est-ce qu'il est possible de lire des données dans le fichier ou le flux ? Est-ce qu'il est possible d'écrire dans le fichier ou d'envoyer des données un flux maintenant ou est-ce que ce n'est pas possible (car une autre application serait en train de faire une écriture) ? La permission de lire ou d'écrire peut être très récente ou très ancienne. Ce qui compte c'est que la permission soit valable à l'instant présent.
2. Si l'état interrogé n'est pas atteint, alors il y a une boucle jusqu'à ce que l'état soit atteint ou que le timeout soit dépassé. La manière dont se déroule cette partie peut dépendre des systèmes Unix, et des types de flux considérés (si c'est un fichier, si c'est un flux de données sur un réseau, etc.).
La fonction poll() ne réveille personne. Elle lit juste l'état en cours, et si l'état n'est pas encore celui qui est requis, alors elle attend que l'état change avant la fin du timeout. Il n'y a pas de surveillance de pile. La fonction poll() est basée sur la lecture des tables internes à Unix associées aux fichiers et aux flux. La fonction poll() fonctionne comme la fonction select() qui, elle-aussi, est passive.
Marsh Posté le 23-09-2007 à 15:38:06
maider29 a écrit : Sous linux la fonction poll() permet d'attendre un evènement, mais comment fonctionne exactement cette fonction ? |
Comme select(), elle suspend le thread courant jusqu'à réception d'un évènement programmé (E/S sur un descripteur, timeout).
http://www.opengroup.org/onlinepub [...] /poll.html
Les détails internes appartiennent à chaque implémentation et ne sont que de peu d'intérêt, sauf si tu dois imlémenter poll() pour un module Linux. Dans ce cas, il faut se référer à la documentation technique de Linux (et ça dépend du noyau).
Marsh Posté le 22-09-2007 à 13:40:07
Sous linux la fonction poll() permet d'attendre un evènement, mais comment fonctionne exactement cette fonction ? attend elle réellement un évènement soit : elle constate un changement d'état ? ou surveille t'elle une pile dans la quelle sont stockés les évènement, cette dernière situation conduirait à ce que poll() réveille le processus alors que l'évènement présent dans la pile n'est pas forcément arrivé recement mais est un ancien évènement qui n'a pas été retiré de la pile.
Je précise que je me suis tapé pas mal de "man poll()" et que même si j'ai mon avis sur la question j'aimerais avoir une réponse claire d'un vrai spécialiste.