Provided by: manpages-de-dev_2.5-1_all 

BEZEICHNUNG
pipe - erstellt eine Pipeline
ÜBERSICHT
#include <unistd.h>
int pipe(int pipefd[2]);
#define _GNU_SOURCE /* Siehe feature_test_macros(7) */
#include <fcntl.h> /* Definitionen der O_*-Konstanten abrufen */
#include <unistd.h>
int pipe2(int pipefd[2], int flags);
BESCHREIBUNG
pipe() erzeugt eine Pipeline, einen unidirektionalen Datenkanal, der für die Kommunikation zwischen
Prozessen verwendet werden kann. Das Feld pipefd wird verwendet, um zwei Dateideskriptoren für die Enden
der Pipeline zurückzugeben. pipefd[0] bezeichnet das Lese-Ende der Pipeline; pipefd[1] das Schreib-Ende.
In das Schreib-Ende der Pipeline geschriebene Daten werden durch den Kernel gepuffert, bis sie aus dem
Lese-Ende der Pipeline gelesen werden (für weitere Details siehe pipe(7)).
Falls flags 0 ist, dann ist pipe2() dasselbe wie pipe(). Um ein anderes Verhalten zu bewirken, können die
folgenden Werte in flags bitweise ODER-verknüpft werden:
O_CLOEXEC
Setzt den Schalter »schließen bei Ausführung« (close-on-exec, FD_CLOEXEC) für die beiden neuen
Dateideskriptoren. Die Beschreibung desselben Schalters in open(2) begründet, warum das nützlich
sein kann.
O_DIRECT (seit Linux 3.4)
Erstellt eine Pipeline, die E/A im »Paketmodus« durchführt. Jeder write(2) in die Pipeline wird
als separates Paket gehandhabt und read(2)s aus der Pipeline werden ein Paket auf einmal lesen.
Beachten Sie die folgenden Punkte:
* Schreibvorgänge mit mehr als PIPE_BUF Bytes (siehe pipe(7)) werden in mehrere Pakete
aufgeteilt. Die Konstante PIPE_BUF ist in <limits.h> definiert.
* Falls ein read(2) einen Puffer angibt, der kleiner als das nächste Paket ist, dann wird die
angeforderte Anzahl an Bytes gelesen und die überzähligen Bytes im Paket werden verworfen. Es
reicht aus, die Puffergröße als PIPE_BUF anzugeben, um das größtmögliche Paket zu lesen (siehe
hierzu auch den vorherigen Punkt).
* Pakete der Länge null werden nicht unterstützt. (Ein read(2), der eine Pufferlänge der Größe
null angibt, ist eine Nullaktion und liefert 0 zurück.)
Ältere Kernel, die diesen Schalter nicht unterstützen, zeigen dies mit dem Fehler EINVAL an.
Seit Linux 4.5 ist es möglich, die Einstellung O_DIRECT eines Pipe-Dateideskriptors mittels
fcntl(2) zu ändern.
O_NONBLOCK
setzt den Dateistatus-Schalter O_NONBLOCK für einen der beiden offenen Dateideskriptoren. Die
Verwendung dieses Schalters spart zusätzliche Aufrufe von fcntl(2), um das gleiche Ergebnis zu
erreichen.
RÜCKGABEWERT
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend
gesetzt.
Unter Linux (und anderen Systemen) verändert pipe() beim Fehlschlag pipefd nicht. Eine Anforderung, die
dieses Verhalten standardisiert, wurde in POSIX.1-2016 hinzugefügt. Ein Linux-spezifischer Systemaufruf
pipe2() ändert entsprechend auch pipefd beim Fehlschlag nicht.
FEHLER
EFAULT pipefd ist ungültig.
EINVAL (pipe2()) ungültiger Wert in flags
EMFILE Die Beschränkung pro Prozess der Anzahl offener Datei-Deskriptoren wurde erreicht.
ENFILE Die systemweite Beschränkung für die Gesamtzahl offener Dateien wurde erreicht.
ENFILE Die benutzerbezogene harte Grenze des Speichers, der für Pipes zugewiesen werden kann, wurde
erreicht und der Aufrufende verfügt nicht über Privilegien; siehe pipe(7).
VERSIONEN
pipe2() wurde zu Linux in der Version 2.6.27 hinzugefügt; Glibc unterstützt die Funktion seit Version
2.9.
KONFORM ZU
pipe(): POSIX.1-2001, POSIX.1-2008.
pipe2() ist Linux-spezifisch.
BEISPIEL
Das folgende Programm erstellt eine Pipeline und erzeugt anschließend mittels fork(2) einen Kindprozess;
das Kind erbt einen kopierten Satz von Dateideskriptoren für dieselbe pipeline. Danach schließt jeder
Prozess die Dateideskriptoren, die er nicht für die Pipeline benötigt (siehe pipe(7)). Der Elternprozess
schreibt dann die Zeichenfolge im Befehlszeilen-Argument in die Pipeline. Der Kindprozess liest diese
Zeichenfolge byteweise aus der Pipeline und gibt sie auf der Standardausgabe aus.
Programmquelltext
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;
if (argc != 2) {
fprintf(stderr, "Aufruf: %s <Zeichenkette>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (pipe(pipefd) == -1) {
perror("Pipeline"); /* Systemfehlermeldung ausgeben */
exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == -1) {
perror("Aufruf von fork(2)");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* Kindprozess liest aus Pipeline */
close(pipefd[1]); /* nicht verwendetes Schreib-Ende schließen */
while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);
} else { /* Elternprozess schreibt argv[1] in die Pipeline */
close(pipefd[0]); /* nicht verwendetes Lese-Ende schließen */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* der Lesende wird EOF sehen*/
wait(NULL); /* auf "das Kind" warten */
exit(EXIT_SUCCESS);
}
}
SIEHE AUCH
fork(2), read(2), socketpair(2), splice(2), tee(2), vmsplice(2), write(2), popen(3), pipe(7)
KOLOPHON
Diese Seite ist Teil der Veröffentlichung 4.15 des Projekts Linux-man-pages. Eine Beschreibung des
Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden
sich unter https://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Lars J. Brandt <ljbrandt@jorma.ping.de>, Martin
Eberhard Schauer <Martin.E.Schauer@gmx.de>, Mario Blättermann <mario.blaettermann@gmail.com> und Helge
Kreutzmann <debian@helgefjell.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer
bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an
<debian-l10n-german@lists.debian.org>.
Linux 26. November 2017 PIPE(2)