Implementierung von FIFO in der Linux-Prozesskommunikation

Implementierung von FIFO in der Linux-Prozesskommunikation

FIFO-Kommunikation (First In First Out)

FIFO-Named Pipe, die die Kommunikation zwischen nicht verwandten Prozessen ermöglicht.

  • Erstellen einer Pseudodatei für eine Pipe
    • a. Erstellen Sie einen Testfifo-Befehl mit mkfifo
    • b. Sie können auch die Funktion int mkfifo(const char *pathname, mode_t mode); verwenden.
  • Der Kernel öffnet einen Puffer für die FIFO-Datei und bedient die FIFO-Datei. Er kann den Puffer bedienen und eine prozessübergreifende Kommunikation realisieren - tatsächlich handelt es sich dabei um Lesen und Schreiben von Dateien.

Mann 3 mkfifo

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *Pfadname, mode_t Modus);

Notiz:

FIFOs
Das Öffnen des Lese- oder Schreibendes eines FIFO blockiert, bis auch das andere Ende geöffnet wird (durch einen anderen Prozess oder Thread). Siehe
fifo(7) für weitere Einzelheiten.

Beim Öffnen einer FIFO-Datei wird das Lesende blockiert, während darauf gewartet wird, dass das Schreibende geöffnet wird. Auch das Schreibende wird blockiert, während darauf gewartet wird, dass ein anderes Ende geöffnet wird.

Codebeispiel:
file_w.c schreiben Ende

#include <stdio.h>
#include <stdlib.h>
#einschließen <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char *argv[]) {
  wenn(argc != 2) {
    printf("./a.out dateiname1\n");
    Rückgabe -1;
  }
  printf("beginne mit offenem w\n");
  int o_ret = öffnen(argv[1], O_WRONLY);
  printf("ende öffnen w\n");
  char buf[256];
  int num = 0;
  während (1) {
    memset(buf, '\0', Größe von(buf));
    sprintf(buf, "xiaoming--%d", num++);
    printf("strlen(buf) = %d\n", strlen(buf));
    schreiben(o_ret, buf, strlen(buf));
    Schlaf (1);
  }
  schließen(o_ret);
  gebe 0 zurück;
}
 

file_r.c Seite lesen

#include <stdio.h>
#include <stdlib.h>
#einschließen <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char *argv[]) {
  wenn(argc != 2) {
    printf("./a.out dateiname1\n");
    Rückgabe -1;
  }
  printf("beginne mit dem Öffnen von r\n");
  o_ret = öffnen(argv[1], O_RDONLY);
  printf("Ende offen r\n");
  char buf[256];
  int num = 0;
  während (1) {
    memset(buf, '\0', Größe von(buf));
    lesen(o_ret, buf, sizeof(buf));
    printf("strlen(buf) = %d\n", strlen(buf));
    printf("gelesen ist %s\n", buf);
  }
  schließen(o_ret);
  gebe 0 zurück;
}

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Linux-Interprozesskommunikation über anonyme Pipes
  • Beispiel für die Verwendung von Sockets für die Interprozesskommunikationsmethode unter Linux
  • Eine kurze Diskussion über Linux-Interprozesskommunikationsmethoden und ihre Vor- und Nachteile
  • Detaillierte Erläuterung der Implementierung der Interprozesskommunikation in der Linux-Nachrichtenwarteschlange
  • Interprozesskommunikation unter Linux – mithilfe von Signalen
  • Linux-Interprozesskommunikation – mithilfe von Stream-Sockets
  • Detaillierte Erklärung der Linux-Interprozesskommunikation - Verwendung von Semaphoren
  • Detaillierte Erläuterung der Interprozesskommunikation unter Linux - Verwendung von Shared Memory
  • Linux-Applet zur Interprozesskommunikation

<<:  4 Möglichkeiten zum Ändern des MySQL-Root-Passworts (Zusammenfassung)

>>:  jQuery implementiert Warenkorbfunktion

Artikel empfehlen

Sechsstufiger Beispielcode für eine JDBC-Verbindung (Verbindung zu MySQL)

Sechs Schritte von JDBC: 1. Registrieren Sie den ...

Implementierung des WeChat-Applet-Nachrichten-Pushs in Nodejs

Auswählen oder Erstellen einer Abonnementnachrich...

So setzen Sie das Zabbix-Passwort zurück (ein Schritt)

Problembeschreibung Da wir uns nicht lange bei Za...

So migrieren Sie SQLite zu einem MySQL-Skript

Ohne weitere Umschweife werde ich den Code direkt...

Zusammenfassung zur Positionierung in CSS

Es gibt vier Arten der Positionierung in CSS, die...

Einführung in die Verwendung des HTML-Basistags target=_parent

Der <base>-Tag gibt die Standardadresse oder...

Detaillierte Erklärung der benutzerdefinierten Swiper-Komponente in JavaScript

Inhaltsverzeichnis Effektanzeige Komponenteneinst...

Umfassendes Verständnis von Zeilenhöhe und vertikaler Ausrichtung

Vorherige Wörter Zeilenhöhe, Schriftgröße und vert...