Zusammenfassung der Linux FD-Ereignis-API

Dieses Mal habe ich die Möglichkeit, neue Ereignis-APIs wie libevent und libev zu verwenden, daher werde ich sie zusammenfassen. Wenn Sie sich eingehend damit befassen, können Sie sehen, dass dies wird passieren, also nur eine kurze Einführung.

** Ereignisfluss hier **

  1. Erstellen Sie einen Dateideskriptor.
  2. Die Standby-Seite überwacht das Ereignis mit diesem Dateideskriptor.
  3. Der Notifier benachrichtigt diesen Dateideskriptor über das Ereignis.
  4. 2 erkennt das gemeldete Ereignis und führt den Prozess aus.

Wenn es danach als ** FD geschrieben ist, stellen Sie es sich bitte als Dateideskriptor ** vor.

Es ist ein Bild des Gesprächs zwischen Threads, Prozessen usw. Je nach Element werden die Ereignisüberwachung und die Benachrichtigung selbst so verpackt, dass der Benutzer nichts davon merkt. Zum Beispiel ...

Dies mag für High-End-Sprachen natürlich sein, aber ich denke, dass das FD-Ereignis, das OSS bereit hält und es Ihnen ermöglicht, selbst zu optimieren, eine Funktion ist, die nur in der C-Sprache verfügbar ist.

** 1. Dateideskriptor **

Es gibt verschiedene. Ist die Ereignisüberwachung, die später eingeführt wird, erheblich oder umgekehrt, da die Ereignisemittenten von FD erheblich sind? Wenn Sie interessiert sind, kann es interessant sein, die Geschichte nachzuschlagen.

API Überblick Bemerkungen
open /dev/console(Standardausgabe)Etwaswaroffenundwurdeausgetauscht.Bestimmt. FührenSiekeineVorgängefürGerätedateienaus,dienurfürnormaleDateienausgeführtwerdensollten
socket API, die Sie zuerst in der Kommunikationsverarbeitung lernen. Es gibt verschiedene Optionen für das Senden und Empfangen mit setsockopt, daher ist es tiefgreifend(Schau nicht hin Diese Optionen werden in OSS auf verschiedene Arten verwendet, sodass Sie beim Betrachten des OSS-Codes etwas Unerwartetes entdecken.
socketpair Empfohlen, wenn Sie die Steckdose schnell verwenden möchten. Sie können mit einer API kommunizieren. Während bidirektionale Kommunikation möglich ist, ist es schwierig, zwei FDs zu verwenden
eventfd EineAPInurfürBenachrichtigungen.Zählertyp,Sende-NummerbeimSenden(Wennes0ist,antwortetFDnicht)Die Leseseite kann den Zähler lesen. Ein FD ist genug. Wenn es also ein Weg ist, ist es möglicherweise besser, dies zu entwickeln
timerfd Transzendentale praktische API, die nach einer bestimmten Zeit ein Ereignis ausgibt Wenn Sie eine Umgebung ohne Timerfd haben, sollten Sie Ihre eigene erstellen. Ich mag es auf der Ebene.
signalfd ErstellenSieeinenFD,umdasSignalaufzunehmen.Esistpraktisch,SignaleimHaupt-Standbyempfangenzukönnen. Signaldefinition,BeachtenSie,dassdieSignalhandlereingeschränktsind.Referenzvonsignalfd
mq_open Öffnen Sie den Prozess für die Nachrichtenwarteschlangendatei read/Das Schreiben erfolgt auch mit einer dedizierten API.
pipe API zum Erstellen von FD, die für die gegabelte Kommunikation zwischen Prozessen verwendet werden kann Es ist eine unidirektionale Kommunikation, anstatt in der Gabel verfügbar zu sein.

** 2. Ereignisüberwachung **

** Empfangsfunktion **

API Überblick
read,revc, etc Grundlegende Dateideskriptoren lesen
mq_revc API, die über die Nachrichtenwarteschlangendatei empfangen werden kann.

** Ereignisüberwachungsfunktion **

Wenn Sie es einfach erhalten, ist es 1 API pro 1FD, was ineffizient ist. Daher ist es zweckmäßig, eine Funktion zum gemeinsamen Überwachen von FDs zu haben. Diese Funktion ist wesentlich.

API Überblick Persönlicher Eindruck
select, pselect Gute alte klassische API,Auch kompatibel mit Windows Es ist besser, FD klar zu verwenden. FD jedes Mal_Es ist mühsam, mit API wie ISSET zu überprüfen
epoll Eine verbesserte Version von select, die das ständige Zurücksetzen des FD überflüssig macht EPOLL_CTL_Wenn Sie HINZUFÜGEN, wird FD ohne Erlaubnis zum Standby-Modus hinzugefügt, sodass dies ganz einfach ist. Als persönliches Hobby ist Select das Beste
libevent OSS,dasdieobengenannteEreignisüberwachungs-APIumschließtundderenVerwendungvereinfacht DasRückrufformatisteinfachzubedienen.EshatjedocheinenempfindlichenEindruck,wahrscheinlichweilesnichtfadensicherist.EinkurzerzusammenfassenderArtikel
libev Hochgeschwindigkeits-kompatibleVersionoben.API-Referenz..DokumentistREADME⇒Hier
WeitereInformationenfindenSiezuerstunter"WASLESEN,WENNSIEEILIGSIND"undunter"FUNKTIONEN,DIEEREIGNIS-LOOPSSTEUERN".
Dokumentesindaucherheblich.WenneskeinProblemmitderGPLgibt,scheintesgut,diesauszuwählen.
EvfürMultithread-Verwendung_default_loop(0)Nicht ev_loop_new, ev_loop, ev_Verwenden Sie Unloop.

Ich denke, es gibt oben verschiedene Beispiele, aber es wird empfohlen, sich fdevent_XXX.c von lighttpd anzusehen. Es ist alles organisiert. Da der OSS-Code für die Unterstützung mehrerer Umgebungen vorgesehen ist, werden mehrere Prozesse geschrieben, sodass Sie die garantierte Implementierung jeder Funktion sehen können.

** 3. Event-Ausgabe **

API Überblick
write,send Grundlegende Dateideskriptoren schreiben
mq_send API, die über die Nachrichtenwarteschlangendatei gesendet werden kann

Mit Ausnahme von mq kann write für andere FDs verwendet werden. Darüber hinaus ist timerfd FD und Ereignisausgabe.

** Andere **

19.06.2018 Nachtrag Es ist nicht FD, aber es gibt auch pthread_cond. Da es in Kombination mit Mutex verwendet wird, kann es gut sein, wenn es bereits exklusiv für Mutex ist.

Referenz

Verlauf mehrerer E / A https://itkq.jp/blog/2017/05/10/linux-file-and-io/ Jeder Link

Recommended Posts

Zusammenfassung der Linux FD-Ereignis-API
Linux Zusammenfassung
[Linux] Grundlegende Befehlsübersicht
Linux eine Zusammenfassung Tastenkombination
Zusammenfassung der Linux-Verteilungstypen
Die Linux Watchdog-Treiber-API
[Linux] [Grundeinstellung] [Flattern] Zusammenfassung
Eine kurze Zusammenfassung von Linux
[Linux] Zusammenfassung der Benutzer- / Gruppenbefehle
Zusammenfassung der Backtrace-Erfassungsmethode für [Linux] [C / C ++]
[Windows] Übertragen Sie Ereignisprotokolle an Linux
Zusammenfassung der Links zum Aufbau des Linux-Servers (CentOS7)