pipe(2) | System Calls Manual | pipe(2) |
pipe - erstellt eine Pipe
Standard-C-Bibliothek (libc, -lc)
#include <unistd.h>
int pipe(int Pipedd[2]);
#define _GNU_SOURCE /* siehe feature_test_macros(7) */ #include <fcntl.h> /* Definition der O_*-Konstanten */ #include <unistd.h>
int pipe2(int Pipedd[2], int Schalter);
/* Auf Alpha-, IA-64-, MIPS-, SuperH- und SPARC/SPARC64-Systemen hat pipe() den folgenden Prototyp; siehe ANMERKUNGEN */
#include <unistd.h>
struct fd_pair { long fd[2]; }; struct fd_pair pipe(void);
pipe() erzeugt eine Pipe, einen unidirektionalen Datenkanal, der für die Kommunikation zwischen Prozessen verwendet werden kann. Das Feld Pipedd wird verwendet, um zwei Dateideskriptoren für die Enden der Pipe zurückzugeben. pipefd[0] bezeichnet das Lese-Ende der Pipe; pipefd[1] das Schreib-Ende. In das Schreib-Ende der Pipe geschriebene Daten werden durch den Kernel gepuffert, bis sie aus dem Lese-Ende der Pipe gelesen werden (für weitere Details siehe pipe(7)).
Falls Schalter 0 ist, dann ist pipe2() dasselbe wie pipe(). Um ein anderes Verhalten zu bewirken, können die folgenden Werte in Schalter bitweise ODER-verknüpft werden:
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben, errno gesetzt, um den Fehler anzuzeigen und Pipedd bleibt unverändert.
Unter Linux (und anderen Systemen) verändert pipe() beim Fehlschlag Pipedd nicht. Eine Anforderung, die dieses Verhalten standardisiert, wurde in POSIX.1-2008 TC2 hinzugefügt. Ein Linux-spezifischer Systemaufruf pipe2() ändert entsprechend auch Pipedd beim Fehlschlag nicht.
pipe2() wurde zu Linux in der Version 2.6.27 hinzugefügt; Glibc unterstützt die Funktion seit Version 2.9.
pipe(): POSIX.1-2001, POSIX.1-2008.
pipe2() ist Linux-spezifisch.
Das System-V-ABI auf einigen Architekturen erlaubt die Verwendung von mehr als einem Register zum Zurückliefern mehrerer Werte; eine Reihe von Architekturen (konkret Alpha, IA-64, MIPS, SuperH und SPARC/SPARC64) (mis-)brauchen diese Funktionalität, um den Systemaufruf pipe() auf eine funktionale Weise zu implementieren: der Aufruf akzeptiert keine Argumente und liefert im Erfolgsfall ein Paar von Dateideskriptoren als Rückgabewert zurück. Die Glibc-Wrapperfunktion pipe() geht damit transparent um. Siehe syscall(2) für Informationen im Hinblick auf die Register, die zur Speicherung des zweiten Dateideskriptors verwandt werden.
Das folgende Programm erstellt eine Pipe 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 Pipe benötigt (siehe pipe(7)). Der Elternprozess schreibt dann die Zeichenfolge im Befehlszeilen-Argument in die Pipe. Der Kindprozess liest diese Zeichenfolge byteweise aus der Pipe und gibt sie auf der Standardausgabe aus.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> #include <unistd.h> int main(int argc, char *argv[]) { int pipefd[2]; char buf; pid_t cpid; if (argc != 2) { fprintf(stderr, "Aufruf: %s <Zeichenkette>\n", argv[0]); exit(EXIT_FAILURE); } if (pipe(pipefd) == -1) { perror("Pipe"); /* Systemfehlermeldung ausgeben */ exit(EXIT_FAILURE); } cpid = fork(); if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (cpid == 0) { /* Kindprozess liest aus Pipe */ 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 Pipe */ 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); } }
fork(2), read(2), socketpair(2), splice(2), tee(2), vmsplice(2), write(2), popen(3), pipe(7)
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 die Mailingliste der Übersetzer.
5. Februar 2023 | Linux man-pages 6.03 |