Kqueue est une interface de notification d'événements évolutive introduite dans FreeBSD 4.1 en juillet 2000, également prise en charge dans NetBSD , OpenBSD , DragonFly BSD et macOS . Kqueue a été initialement écrit en 2000 par Jonathan Lemon, alors impliqué dans l' équipe de base de FreeBSD . Kqueue permet à des logiciels comme nginx de résoudre le problème c10k . Le terme « kqueue » fait référence à sa fonction de « file d'attente d'événements du noyau »
Kqueue fournit des pipelines d'événements d'entrée et de sortie efficaces entre le noyau et l'espace utilisateur . Ainsi, il est possible de modifier les filtres d'événements ainsi que de recevoir les événements en attente tout en utilisant un seul appel système à chaque itération de la boucle d'événementskevent(2) principale . Cela contraste avec les anciens appels système d'interrogation traditionnels tels que et qui sont moins efficaces, en particulier lors de l'interrogation d'événements sur de nombreux descripteurs de fichiers. poll(2)select(2)
Kqueue gère non seulement les événements de descripteur de fichier , mais est également utilisé pour diverses autres notifications telles que la surveillance des modifications de fichiers , les signaux , les événements d'E/S asynchrones (AIO), la surveillance des changements d'état des processus enfants et les temporisateurs qui prennent en charge la résolution en nanosecondes . De plus, kqueue fournit un moyen d'utiliser des événements définis par l'utilisateur en plus de ceux fournis par le noyau.
Certains autres systèmes d'exploitation qui traditionnellement ne prenaient en charge que les alternatives d'interrogation plus efficaces, comme epoll sur Linux et les ports d'achèvement d'E/S sur Windows et Solaris , proposent select(2)également actuellement ces alternatives.poll(2)
libkqueueest une implémentation de l'espace utilisateurkqueue(2) de , qui traduit les appels vers le mécanisme d'événement backend natif d'un système d'exploitation.
API
Les prototypes et types de fonctions se trouvent dans sys/event.h.
int kqueue ( void );
Crée une nouvelle file d'attente d'événements du noyau et renvoie un descripteur.
int kevent ( int kq , const struct kevent * liste de modifications , int nchanges , struct kevent * liste d'événements , int nevents , const struct timespec * délai d'attente );
Utilisé pour enregistrer les événements dans la file d'attente, puis attendre et renvoyer les événements en attente à l'utilisateur. Contrairement à epoll , kqueue utilise la même fonction pour enregistrer et attendre les événements, et plusieurs sources d'événements peuvent être enregistrées et modifiées à l'aide d'un seul appel. Le changelisttableau peut être utilisé pour transmettre des modifications (changer le type d'événements à attendre, enregistrer de nouvelles sources d'événements, etc.) à la file d'attente des événements, qui sont appliquées avant le début de l'attente des événements. neventsest la taille du eventlisttableau fourni par l'utilisateur qui est utilisé pour recevoir les événements de la file d'attente des événements.
EV_SET ( kev , ident , filtre , indicateurs , fflags , données , udata );
Une macro utilisée pour l'initialisation pratique d'un struct keventobjet.