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

MySQL 8.0 DDL-Atomaritätsfunktion und Implementierungsprinzip

1. Übersicht über die Atomizität von DDL Vor 8.0 ...

Farbverlauf für HTML-Hintergrund durch CSS erreicht

Screenshots der Effekte: Implementierungscode: Cod...

Implementierung der Clusterkonstruktion im Docker Redis5.0-Cluster

Systemumgebung: Ubuntu 16.04LTS In diesem Artikel...

Detaillierte Erklärung zur Verwendung von umask unter Linux

Ich habe vor Kurzem angefangen, Linux zu lernen. ...

Einführung in die Verwendung des http-equiv-Attributs im Meta-Tag

Meta ist ein Hilfstag im Kopfbereich der HTML-Spra...

CSS3-Eigenschaft line-clamp steuert die Verwendung von Textzeilen

Beschreibung: Begrenzen Sie die Anzahl der Textze...

Konfigurieren von MySQL und Squel Pro auf dem Mac

Als Reaktion auf die Popularität von nodejs haben...

MySQL-Fall beim Gruppieren nach Beispiel

Eine MySQL-ähnliche PHP-Switch-Case-Anweisung. wä...

Lösen Sie das Problem, dass Docker das MySQL-Image zu langsam zieht

Nachdem wir eine halbe Stunde lang versucht hatte...

Implementierung der Vue-Einzeldateikomponente

Ich habe kürzlich über Vue gelesen. Ich habe eine...

Detaillierte Erklärung der Rolle des neuen Operators in Js

Vorwort Js ist heutzutage die am häufigsten verwe...

MySQL und MySQL Workbench Installations-Tutorial unter Ubuntu

Ubuntu-JDK installieren: [Link] Installieren Sie ...