Service de noyau fp_select
Objectif
Fournit une prise en charge en cascade, ou redirigée, de la demande de sélection ou d'interrogation.
Syntaxe
#include <sys/types.h> #include <sys/errno.h> int fp_select ( fp, events, rtneventp, notify) fichier struct *fp; ushort événements; ushort *rtneventp; void (*notifier) () ;
Paramètres
| Article | Descriptif |
|---|---|
| Fp | Pointe vers l'instance ouverte du pilote de périphérique, du socket ou du tube pour lequel l'opération de sélection de niveau inférieur est prévue. |
| événements | Identifie les événements à vérifier. Il existe trois indicateurs d'événement standard définis pour les fonctions Sondage et Sélectionner et un indicateur d'information. Le fichier /usr/include/sys/poll.h détaille la définition de bit d'événement. Les quatre indicateurs de base sont les suivants:
|
| Rtneventp | Indique le pointeur des événements renvoyés. Ce paramètre, transmis par référence, est utilisé pour indiquer quels événements sélectionnés sont vrais à l'heure actuelle. Les bits d'événement renvoyés incluent les événements demandés ainsi qu'un indicateur d'événement d'erreur supplémentaire:
|
| notify | Pointe vers une routine à appeler lorsque l'objet spécifié appelle le service de noyau Selnotifier pour une requête de sélection ou d'interrogation asynchrone en attente. Si aucune routine ne doit être appelée, ce paramètre doit être NULL. |
Descriptif
Le service de noyau Fp_select est un service de bas niveau utilisé par les extensions de noyau pour effectuer une opération de sélection pour un périphérique ouvert, un socket ou un canal nommé. Le service de noyau Fp_select peut être utilisé pour les demandes de sélection synchrones et asynchrones. Les requêtes synchrones indiquent l'état en cours d'une unité et les demandes asynchrones permettent à l'appelant d'être informé des événements futurs sur un périphérique.
Appel provenant de la routine ddselect d'un pilote de périphérique
La routine Ddselect du pilote d'unité peut appeler le service de noyau Fp_select pour transmettre des requêtes de sélection / interrogation à d'autres pilotes de périphérique. La routine Ddselect pour une unité appelle le service de noyau Fp_select , qui appelle la routine Ddselect pour un deuxième périphérique, etc. Cette opération est requise lorsque les informations d'événement pour l'unité d'origine dépendent des événements se produisant sur d'autres unités. Une chaîne en cascade de requêtes SELECT peut être lancée qui implique plus de deux unités, ou une seule unité peut émettre des appels Fp_select à plusieurs autres périphériques.
Chaque routine Ddselect doit conserver, dans son appel au service de noyau Fp_select , le même indicateur POLLSYNCHRONISÉ qu'il a reçu lorsqu'il a été appelé précédemment par le service de noyau Fp_select .
Appel de la routine ddselect d'un pilote de périphérique
Si le service de noyau Fp_select est appelé en dehors de la routine Ddselect du pilote de périphérique, le service de noyau Fp_select définit l'indicateur POLLSYNCHRONISÉ , rendant toujours la requête synchrone. Dans ce cas, aucune notification d'événements futurs pour l'unité spécifiée n'est effectuée, pas plus qu'une routine Notification appelée, si elle est spécifiée. Le service de noyau Fp_select peut être utilisé de cette manière (sans rapport avec un sondage ou une demande de sélection en cours) pour vérifier le statut actuel d'un objet.
Traitement asynchrone et utilisation de la routine de notification
Pour les demandes asynchrones, le service de noyau Fp_select permet à ses correspondants d'enregistrer une routine Notification à appeler par le noyau lorsque des événements spécifiés deviennent vrais. Lorsque le pilote de périphérique concerné détecte qu'un ou plusieurs événements en attente sont devenus vrais, il appelle le service de noyau Selnotifier . Le service de noyau Selnotifier appelle la routine Notification , si elle a été enregistrée. Ainsi, la routine Notification est appelée lors de l'interruption et doit être programmée pour s'exécuter dans un environnement d'interruption.
L'utilisation d'une routine Notification affecte à la fois la séquence d'appel au moment de l'interruption et la façon dont les informations demandées sont réellement signalées. Le traitement asynchrone généralisé entraîne la séquence d'événements suivante:
- Une demande de sélection est lancée sur une unité et transmise (par plusieurs appels de service de noyau Fp_select ) à d'autres périphériques. Par la suite, la routine Ddselect d'un pilote de périphérique qui ne dépend pas d'autres unités pour obtenir des informations est atteinte. Cette routine Ddselect détecte qu'aucun des événements demandés n'est vrai, mais se souvient de la demande asynchrone et retourne à l'appelant. De cette façon, l'ensemble de la chaîne d'appels est sauvegardé, jusqu'à ce que l'origine de la demande de sélection soit atteinte. Le noyau met alors le processus d'origine à dormir.
- Plus tard, un ou plusieurs événements deviennent vrais pour l'unité en mémoire de la demande asynchrone. La routine du pilote de périphérique (éventuellement un gestionnaire d'interruption) appelle le service de noyau Selnotifier .
- Si les événements sont toujours en attente, le service de noyau Selnotifier répond de l'une des deux manières. Si aucune routine Notification n'a été enregistrée lorsque la demande de sélection a été effectuée pour l'unité, tous les processus en attente d'événements sur ce périphérique sont réveillés. Si une routine Notification existe pour l'unité, cette routine est appelée. La routine Notification détermine si l'événement demandé d'origine doit être signalé comme true, et si tel est le cas, appelle le service de noyau Selnotifier seul.
L'exemple suivant détaille un scénario en cascade impliquant plusieurs unités. Supposons qu'une demande a été effectuée pour l'unité A et que l'unité A dépend de l'unité B, qui dépend de l'unité C. Lorsque des événements spécifiés deviennent vrais au niveau de l'unité C, le service de noyau Selnotifier appelé à partir du pilote de périphérique de l'unité C se produit différemment selon qu'une routine Notification a été enregistrée au moment de la demande.
Traitement en cascade sans utilisation des routines de notification
Si aucune routine Notification n'a été enregistrée à partir de l'unité B, le service de noyau Selnotifier détermine que les événements spécifiés doivent être considérés comme vrais pour le pilote de périphérique à la tête de la chaîne en cascade. (La tête de la chaîne, dans ce cas, l'unité A, est le premier pilote de périphérique à émettre le service de noyau Fp_select à partir de sa routine de sélection.) Le service de noyau Selnotifier réveille tous les processus en attente d'événements qui se sont produits sur l'unité A.
Il est important de noter que lorsqu'aucune routine Notification n'est utilisée, tout pilote de périphérique de la chaîne d'appel qui signale un événement avec le service de noyau Selnotifier provoque l'apparition de cet événement pour le premier périphérique de la chaîne. Par conséquent, tous les processus en attente d'événements qui se sont produits sur ce premier périphérique sont réveillés.
Traitement en cascade avec les routines de notification
Si, d'un autre côté, les routines Notification ont été enregistrées tout au long de la chaîne, chaque unité d'interruption (en appelant le service de noyau Selnotifier ) appelle la routine Notification pour l'unité au-dessus de celle-ci dans la chaîne d'appel. Ainsi, dans l'exemple précédent, le service de noyau Selnotifier pour l'unité C appelle la routine Notification enregistrée lorsque la routine Ddselect de l'unité B a appelé le service de noyau Fp_select . La routine Notification de l'unité B doit ensuite décider si elle doit appeler de nouveau le service de noyau Selnotifier pour alertant la routine Notification de l'unité A. Si c'est le cas, la routine Notification de l'unité A est appelée et détermine elle-même s'il faut appeler une autre routine Selnotifier . Si c'est le cas, le service de noyau Selnotifier réveille tous les processus en attente d'événements survenus pour l'unité A.
Une variante de ce scénario implique une chaîne en cascade dans laquelle seuls certains pilotes de périphérique ont enregistré des routines Notification . Dans ce cas, le service de noyau Selnotifier à chaque niveau appelle la routine Notification pour le niveau ci-dessus, jusqu'à ce qu'un niveau soit rencontré pour lequel aucune routine Notification n'a été enregistrée. À ce stade, tous les événements d'intérêt sont déterminés comme étant vrais pour le conducteur de l'appareil à la tête de la chaîne en cascade. Si des routines Notification ont été enregistrées à des niveaux supérieurs au niveau actuel, elles ne sont jamais appelées.
Retour à partir du service de noyau fp_select
Le service de noyau Fp_select n'attend pas que les événements sélectionnés deviennent vrais, mais revient immédiatement après l'appel de la routine Ddselect de l'objet.
Si la routine de sélection de l'objet est appelée, le code retour du service de noyau Fp_select est défini sur le code retour fourni par la routine Ddselect de l'objet.
Environnement d'exécution
Le service de noyau Fp_select peut être appelé à partir de Environnement de processus uniquement.
Valeurs renvoyées
| Article | Descriptif |
|---|---|
| 0 % | Indique que l'exécution a réussi. |
| ENCORE UNE FOIS | Indique que l'allocation des structures de données internes a échoué. Le paramètre Rtneventp n'est pas mis à jour. |
| EINVAL | Indique que le paramètre Fp n'est pas un pointeur de fichier valide. Le paramètre Rtneventp a l'indicateur POLLNVAL . |
Le service de noyau Fp_select peut également être défini sur le code retour différent de zéro à partir de la routine Ddselect de l'objet spécifié. Le paramètre Rtneventp a l'indicateur POLLERR .