Pipes
Kommunikation zwischen Eltern- und Kindprozess
Pipes ist eine kostenlose C Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist eine Pipe
Eine Pipe ist ein unidirektionaler Kommunikationskanal zwischen verwandten Prozessen. Ein Prozess schreibt Bytes hinein, ein anderer liest sie heraus – wie bei einem Förderband für Daten.
Zwei Dateideskriptoren
Der Aufruf pipe() füllt ein Array mit zwei Elementen: fd[0] ist das Leseende und fd[1] das Schreibende. In fd[1] geschriebene Daten können aus fd[0] gelesen werden.
#include <unistd.h>
#include <stdio.h>
int make_pipe(int fd[2]) {
if (pipe(fd) < 0) { perror("pipe"); return -1; }
/* fd[0] read end, fd[1] write end */
return 0;
}Kombination mit fork
Nach fork() teilen sich Eltern- und Kindprozess die Deskriptoren der Pipe. So kommunizieren Eltern- und Kindprozess: Einer schreibt, der andere liest.
Nicht verwendete Enden schließen
Jeder Prozess sollte das nicht verwendete Ende schließen. Ein Leser schließt das Schreibende, ein Schreiber das Lesende. Andernfalls erkennt der Leser niemals das Dateiende.
#include <unistd.h>
void parent_as_writer(int fd[2]) {
close(fd[0]); /* parent will not read */
write(fd[1], "hello", 5); /* parent writes */
close(fd[1]); /* signal EOF to reader */
}Ein Beispiel mit Eltern- und Kindprozess
Der Elternprozess schreibt eine Nachricht, der Kindprozess liest sie. Jeder schließt das nicht benötigte Ende.
#include <unistd.h>
#include <stdio.h>
void demo(int fd[2]) {
if (fork() == 0) { /* child: reader */
close(fd[1]);
char buf[64];
ssize_t n = read(fd[0], buf, sizeof buf - 1);
buf[n] = 0;
printf("child got: %s\n", buf);
close(fd[0]);
} else { /* parent: writer */
close(fd[0]);
write(fd[1], "hi child", 8);
close(fd[1]);
}
}Lesen liefert EOF
Wenn alle Schreibenden geschlossen sind, gibt read 0 zurück und signalisiert damit das Dateiende. Bleibt ein Schreibende geöffnet, blockiert der Leser dauerhaft und wartet auf weitere Daten – ein häufiger Fehler.
Kapazität und Blockierung von Pipes
Eine Pipe verfügt über einen begrenzten Puffer (oft 64 KB). Wenn dieser voll ist, blockiert write, bis ein Leser Daten daraus entfernt. Wenn er leer ist, blockiert read, bis Daten eintreffen. Diese Flusskontrolle synchronisiert die beiden Prozesse.
Umleiten mit dup2
dup2 kann stdin oder stdout eines Prozesses durch ein Pipe-Ende ersetzen. So implementieren Shells cmd1 | cmd2, indem sie die Ausgabe eines Befehls mit der Eingabe des nächsten verbinden.
#include <unistd.h>
void stdout_to_pipe(int fd[2]) {
close(fd[0]);
dup2(fd[1], STDOUT_FILENO); /* writes to stdout go into pipe */
close(fd[1]);
}Benannte Pipes (FIFOs)
Eine gewöhnliche Pipe verbindet nur verwandte Prozesse. Eine benannte Pipe (FIFO), die mit mkfifo erstellt wurde, erscheint im Dateisystem. Dadurch können nicht verwandte Prozesse sie über ihren Pfad öffnen und kommunizieren.
#include <sys/stat.h>
int make_fifo(const char *path) {
return mkfifo(path, 0666); /* creates a FIFO file */
}SIGPIPE-Gefahr
Das Schreiben in eine Pipe, deren Leseende geschlossen wurde, löst SIGPIPE aus, wodurch der Prozess standardmäßig beendet wird. Ignorieren Sie entweder das Signal oder prüfen Sie den von write gelieferten Fehler EPIPE.
Wann Sie Pipes verwenden sollten
Pipes eignen sich ideal für einfache, unidirektionale Datenströme zwischen Eltern- und Kindprozess oder zum Verketten von Programmen. Für bidirektionale Kommunikation oder die Kommunikation zwischen nicht verwandten Prozessen kommen FIFOs, Sockets oder gemeinsam genutzter Speicher infrage.
Schnelltest
Testen Sie Ihr Verständnis von Pipes.
Zusammenfassung
Sie haben Pipes für die Kommunikation zwischen Eltern- und Kindprozessen kennengelernt.
pipe()liefert fd[0] (Lesen) und fd[1] (Schreiben)- Mit
forkkombinieren; nicht verwendete Enden schließen - read gibt bei EOF 0 zurück, wenn alle Schreibenden geschlossen sind
- FIFOs verbinden nicht verwandte Prozesse; achten Sie auf SIGPIPE
Häufig gestellte Fragen
Ist die Lektion „Pipes“ kostenlos?
Ja — der vollständige Text von „Pipes“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Pipes“?
Kommunikation zwischen Eltern- und Kindprozess Du übst C Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C Academy zu starten?
Keine Vorkenntnisse erforderlich. C Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Pipes“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C Academy-Lektion Code schreiben und ausführen?
Ja. Jede C Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.