Résumé de l'API d'événement Linux FD

Cette fois, j'ai l'opportunité d'utiliser de nouvelles API d'événement telles que libevent et libev, je vais donc les résumer. Si vous approfondissez le sujet, vous pouvez voir cela se produira, donc juste une brève introduction.

** Flux de l'événement ici **

  1. Créez un descripteur de fichier.
  2. Le côté veille surveille l'événement avec ce descripteur de fichier.
  3. Le notifiant notifie ce descripteur de fichier de l'événement.
  4. 2 détecte l'événement notifié et exécute le processus.

Après cela, s'il est écrit comme ** FD, veuillez le considérer comme un descripteur de fichier **.

C'est une image de conversation entre threads, processus, etc. En fonction de l'élément, la surveillance des événements et la notification elle-même sont encapsulées de sorte que l'utilisateur n'en soit pas conscient. Par exemple ...

Cela peut être naturel pour les langages haut de gamme, mais je pense que l'événement FD, qui a OSS prêt et vous permet de régler vous-même, est une fonction unique au langage C.

** 1. Descripteur de fichier **

Il y a plusieurs. Étant donné que les émetteurs d'événements de FD sont importants, la surveillance des événements, qui sera introduite ultérieurement, est-elle substantielle, ou vice versa? Si vous êtes intéressé, il peut être intéressant de consulter l'historique.

API Aperçu Remarques
open /dev/console(Sortiestandard)Quelquechoseétaitouvertetéchangé.Certainement. N'effectuezpasd'opérationssurlesfichiersdepériphériquequinedevraientêtreeffectuéesquesurdesfichiersnormaux
socket API que vous apprendrez d'abord dans le traitement de la communication. Il existe diverses options liées à l'envoi et à la réception avec setsockopt, donc c'est profond(Ne regarde pas Ces options sont utilisées de différentes manières dans OSS, vous découvrirez donc quelque chose d'inattendu lorsque vous regarderez le code OSS.
socketpair Recommandé lorsque vous souhaitez utiliser le socket rapidement. Vous pouvez communiquer avec une API. Bien que la communication bidirectionnelle soit possible, il est difficile d'utiliser deux FD
eventfd UneAPIjustepourlesnotifications.Typedecompteur,envoyerlenuméroàl'envoi(S'ilvaut0,FDnerépondpas), Le côté lecture peut lire le compteur. Un FD suffit, donc s'il s'agit d'un seul moyen, il vaut peut-être mieux le concevoir
timerfd API transcendantale pratique qui émet un événement après une certaine période de temps Si vous avez un environnement sans timerfd, vous devriez créer le vôtre, je l'aime au niveau.
signalfd CréezunFDpourcapterlesignal.Ilestpratiquedepouvoircapterdessignauxenveilleprincipale. Définitiondusignal,Notezquelesgestionnairesdesignauxsontcontraints.Référencedesignalfd
mq_open Processus ouvert pour le fichier de file d'attente de messages read/l'écriture se fait également avec une API dédiée.
pipe API pour créer FD qui peut être utilisée pour la communication inter-processus fourchue C'est une communication unidirectionnelle au lieu d'être disponible dans fork.

** 2. Surveillance des événements **

** Fonction de réception **

API Aperçu
read,revc, etc Lecture des descripteurs de fichiers de base
mq_revc API qui peut être reçue via le fichier de file d'attente de messages.

** Fonction de surveillance des événements **

Si vous le recevez simplement, ce sera 1 API par 1FD, ce qui est inefficace. Par conséquent, il est pratique d'avoir une fonction pour surveiller les FD collectivement. Cette fonction est importante.

API Aperçu Impression personnelle
select, pselect Bonne vieille API classique,Aussi compatible avec Windows Il vaut mieux utiliser FD clairement. FD à chaque fois_Il est gênant de devoir vérifier avec une API telle que ISSET
epoll Une version améliorée de select qui élimine les tracas de la réinitialisation constante du FD EPOLL_CTL_Si vous faites ADD, FD sera ajouté à la veille sans autorisation, donc c'est facile. En tant que passe-temps personnel, sélectionner est le meilleur
libevent OSSquiencapsulel'APIdesurveillancedesévénementsci-dessusetlarendsimpleàutiliser Leformatderappelestfacileàutiliser.Cependant,ilauneimpressiondélicateprobablementparcequ'iln'estpasthread-safe.Unbrefarticledesynthèse
libev Versioncompatiblehautevitesseci-dessus.RéférenceAPI..LedocumentestLISEZ-MOI⇒ici
Veuillezvousréférerd'abordà«QUELIREENCASDEDÉPART»et«FONCTIONSDECONTRÔLEDESBOUCLESD'ÉVÉNEMENT»pourplusdedétails.
Lesdocumentssontégalementimportants.S'iln'yapasdeproblèmeaveclaGPL,ilsemblebondelesélectionner.
Evpouruneutilisationmulti-thread_default_loop(0)Pas ev_loop_new, ev_loop, ev_Utilisez unloop.

Je pense qu'il y a plusieurs exemples ci-dessus, mais il est recommandé de regarder fdevent_XXX.c de lighttpd. Tout est organisé. Étant donné que le code OSS est destiné à la prise en charge de plusieurs environnements, plusieurs processus sont écrits, de sorte que vous pouvez voir l'implémentation garantie de chaque fonction.

** 3. Emission d'événements **

API Aperçu
write,send Écriture de descripteurs de fichiers de base
mq_send API qui peut être envoyée via le fichier de file d'attente de messages

À l'exception de mq, l'écriture peut être utilisée pour d'autres FD. De plus, timerfd est l'émission FD et événement.

** Autre **

Post-scriptum 2018/06/19 Ce n'est pas FD, mais il y a aussi pthread_cond. Puisqu'il est utilisé en combinaison avec mutex, il peut être bon quand il est déjà exclusif avec mutex.

référence

Historique des E / S multiples https://itkq.jp/blog/2017/05/10/linux-file-and-io/ Chaque lien

Recommended Posts

Résumé de l'API d'événement Linux FD
Résumé Linux
[Linux] Résumé des commandes de base
Linux une touche de raccourci récapitulative
Résumé des types de distribution Linux
L'API du pilote Linux Watchdog
[Linux] [Réglage initial] [Flutter] Résumé
Un bref résumé de Linux
[Linux] Résumé de la commande utilisateur / groupe
[Linux] [C / C ++] Résumé de la méthode d'acquisition des traces
[Windows] Transférer les journaux d’événements vers Linux
Résumé des liens de construction du serveur Linux (CentOS7)