int main () {
int fd [2]; // Dateideskriptoren für das Rohr
PID_T PID;
if (pipe (fd) ==-1) {
Perror ("Rohr fehlgeschlagen");
Ausgang (1);
}
pid =fork ();
if (pid <0) {
Perror ("Fork fehlgeschlagen");
Ausgang (1);
} else if (pid ==0) {// Child Process
schließen (fd [1]); // das Schreibende schließen
Zeichenpuffer [100];
read (fd [0], puffer, sizeof (puffer));
printf ("Kind erhalten:%s \ n", Puffer);
schließen (fd [0]);
} else {// Elternprozess
schließen (fd [0]); // das Leseende schließen
const char* message ="Hallo von Eltern!";
Schreiben (fd [1], Nachricht, Strlen (Nachricht) + 1); // +1 für null terminator
schließen (fd [1]);
warte (null); // Warten Sie, bis das Kind fertig ist
}
Rückkehr 0;
}
`` `
benannte Pipes (FIFOS):
* Erstellung: Erstellt mit dem System "Mkfifo ()` Systems. Dadurch wird im Dateisystem eine Datei erstellt, die das Rohr darstellt. Der Name der Datei fungiert als Kennung für das Rohr.
* Zugriff: Mehrere Prozesse können auf ein benanntes Rohr zugreifen. Jeder Prozess, der den Pfad der Pipe kennt, kann ihn zum Lesen oder Schreiben öffnen (obwohl nur ein Prozess gleichzeitig schreiben kann, es sei denn, spezielle Konfigurationen verwendet). Sie überleben über die Lebensdauer der Prozesse hinaus.
* Lebenszeit: Das Rohr bleibt im Dateisystem bestehen, bis sie mit `Unlink ()` explizit gelöscht werden.
* Beispiel (mit zwei separaten Programmen, die über ein benanntes Rohr kommunizieren):
Sie würden zwei Programme benötigen:einen, der in das FIFO schreiben kann, und einen anderen, um daraus zu lesen. `mkfifo ()` wird einmal (vielleicht in einem Setup -Skript) aufgerufen, um das FIFO zu erstellen, und dann die Programme `open ()` Das FIFO für Lesen/Schreiben. Die Prozesse müssen Fehler behandeln, einschließlich der Möglichkeit, dass das FIFO nicht vorhanden ist, und Fehler auf `open ()`.
Schlüsselunterschiede zusammengefasst:
| Feature | Unbenannte Pfeife | Named Pipe (FIFO) |
| ----------------- | ---------------------------- | -------------------------- |
| Schöpfung | `pipe ()` | `mkfifo ()` |
| Zugang | Erstellen nur Prozess | Mehrere Prozesse |
| Persistenz | Existiert nur während der Prozessdauer | Besteht in Dateisystem |
| Interprozess | Normalerweise Elternkind oder explizit verbundene Prozesse | Kann nicht verwandte Prozesse verbinden |
| Dateisystemeintrag | Nein | Ja |
Benannte Pipes sind flexibler für die Kommunikation zwischen nicht verwandten Prozessen, während unbenannte Rohre einfacher und effizienter für die Kommunikation zwischen eng verwandten Prozessen wie einem Elternteil und seinem Kind sind. Die Wahl hängt von den spezifischen Kommunikationsbedürfnissen Ihrer Anwendung ab.