[LINUX] Ein bisschen mehr über FIFO

Was ist FIFO?

Der Name der Pipe ist FIFO. Es ist aus. ls -l | grep keyword In ist | die Pipe, und der ihm gegebene globale Name des Dateisystems ist das FIFO. Die Eigenschaften sind die gleichen wie bei Rohren. Im obigen Beispiel

  1. grep startet und blockiert mit offenem (O_RDONLY) Rohr
  2. ls öffnet das Rohr mit open (O_WRONLY)
  3. ls schreibt die Ausgabe in pipe ()
  4. Der grep wird entsperrt und die Eingabe wird gelesen ()
  5. Schließen Sie das Rohr ()
  6. grep schließt das Rohr ()

Es wird eine Bewegung wie. Es blockiert mit open (), nicht mit read () oder write (). Dies ist in japanischen Manpages geschrieben, aber schwer zu verstehen. Mit anderen Worten, das ist es.

Dateien, die nicht durchsucht werden können (Pipes und FIFOs), beginnen an der aktuellen Position zu lesen. Wenn keine Daten vorhanden sind, werden sie als EOF betrachtet und geben 0 zurück.

Daher blockiert read () nicht. Normalerweise ist dies kein Problem. Wenn Sie jedoch einen Thread für die Kommunikation zwischen Prozessen einrichten und darauf warten möchten, dass Daten in einer Schleife eintreffen, müssen Sie ihn mit open () blockieren, um eine CPU-Verschwendung zu vermeiden. Als Mensch möchte ich jedoch nicht in jeder Schleife öffnen () / schließen (). Am besten blocken Sie mit read ().

Also Nachrichtenwarteschlange

Die POSIX-Nachrichtenwarteschlange ist eine Warteschlange, in der eine begrenzte Anzahl von Nachrichten fester Größe gespeichert werden kann. Da das Blockierungsattribut zum Zeitpunkt der Erstellung hinzugefügt wird, wird es blockiert, bis die Nachricht eintrifft, auch wenn die Warteschlange empfangen wird (wenn es sich um eine Blockierungswarteschlange handelt).

Daher ist es für die Verarbeitung geeignet, die auf das Eintreffen einer Nachricht in einer Thread-Schleife wartet. Es generiert kein SIGPIPE wie eine Pipe und verliert keine Daten, wenn beide Enden des FIFO geschlossen sind (es behält Daten bis zum Herunterfahren bei, da dies die Lebensdauer des Kernels ist).

Datenaustausch zwischen Prozessen

Es scheint, dass es andere Methoden der prozessübergreifenden Kommunikation gibt, wie Semaphos, Signale und gemeinsam genutzten Speicher, aber ich denke, wenn Sie es zum Zweck des Datenaustauschs verwenden, handelt es sich um ein FIFO, eine Warteschlange oder einen Domänensocket. Ich denke, jeder hat seine Vor- und Nachteile, deshalb möchte ich sie in Zukunft zusammenfassen.

Recommended Posts

Ein bisschen mehr über FIFO
Ein bisschen mehr über Referenzen ~ Verwenden von Python und Java als Beispiele ~
Ich habe ein wenig über die wachsende API von TensorFlow nachgedacht
Ein Memorandum über Nan.
Ein Hinweis zu __call__
Ein Hinweis zum Unterprozess
Ein Hinweis zu mprotect (2)
Ein paar süchtig machende Informationen über Cliff, das CLI-Framework
Lesen Sie etwas mehr Arch / Arm / Boot / Compressed / Makefile
(Für mich) Flask_2 (Liste und für, erweitert und ein bisschen mehr)
Ein Hinweis zu KornShell (ksh)
Eine etwas tiefere Geschichte über Blockchain, die die digitale Welt ankreuzt
Memorandum über Korrelation [Python]
Ein Hinweis zur TensorFlow-Einführung
Ein Memorandum über den Python-Mock
Ein bisschen im Kettenschiff stecken
Ein Hinweis zu [Python] __debug__
Lassen Sie uns den Watson IoT Platform Data Store Connector etwas mehr verwenden
Nachdem ich die Python-Bibliothek recherchiert hatte, verstand ich ein wenig über ei.info.
Eine erfrischende Geschichte über Slice in Python
[Java] Ein wenig mysteriöses Split-Verhalten
Python: Ein Hinweis zu Klasse 1 "Abstract"
Hinweis zu get_scorer von sklearn
Eine launische Geschichte über Slice in Python
Ich habe eine Frage zu Leerzeichen
Ein kleines Skript zur Selbstverteidigung von Malware
Machen Sie die C-Kompilierung etwas einfacher
Die Geschichte der Verwendung von Python reduziert
Ein Hinweis zu Mock (Python-Mock-Bibliothek)