pipe(2) System Calls Manual pipe(2) BEZEICHNUNG pipe - erstellt eine Pipe BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int pipe(int Pipedd[2]); #define _GNU_SOURCE /* siehe feature_test_macros(7) */ #include /* Definition der O_*-Konstanten */ #include int pipe2(int Pipedd[2], int Schalter); /* Auf Alpha-, IA-64-, MIPS-, SuperH- und SPARC/SPARC64-Systemen hat pipe() den folgenden Prototyp; siehe VERSIONEN */ #include struct fd_pair { long fd[2]; }; struct fd_pair pipe(void); BESCHREIBUNG pipe() erzeugt eine Pipe, einen unidirektionalen Datenkanal, der fur die Kommunikation zwischen Prozessen verwendet werden kann. Das Feld Pipedd wird verwendet, um zwei Dateideskriptoren fur die Enden der Pipe zuruckzugeben. 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 (fur weitere Details siehe pipe(7)). Falls Schalter 0 ist, dann ist pipe2() dasselbe wie pipe(). Um ein anderes Verhalten zu bewirken, konnen die folgenden Werte in Schalter bitweise ODER-verknupft werden: O_CLOEXEC Setzt den Schalter >>schliessen bei Ausfuhrung<< (close-on-exec, FD_CLOEXEC) fur die beiden neuen Dateideskriptoren. Die Beschreibung desselben Schalters in open(2) begrundet, warum das nutzlich sein kann. O_DIRECT (seit Linux 3.4) Erstellt eine Pipe, die E/A im >>Paketmodus<< durchfuhrt. Jeder write(2) in die Pipe wird als separates Paket gehandhabt und read(2)s aus der Pipe werden ein Paket auf einmal lesen. Beachten Sie die folgenden Punkte: o Schreibvorgange mit mehr als PIPE_BUF Bytes (siehe pipe(7)) werden in mehrere Pakete aufgeteilt. Die Konstante PIPE_BUF ist in definiert. o Falls ein read(2) einen Puffer angibt, der kleiner als das nachste Paket ist, dann wird die angeforderte Anzahl an Bytes gelesen und die uberzahligen Bytes im Paket werden verworfen. Es reicht aus, die Puffergrosse als PIPE_BUF anzugeben, um das grosstmogliche Paket zu lesen (siehe hierzu auch den vorherigen Punkt). o Pakete der Lange null werden nicht unterstutzt. (Ein read(2), der eine Pufferlange der Grosse null angibt, ist eine Nullaktion und liefert 0 zuruck.) Altere Kernel, die diesen Schalter nicht unterstutzen, zeigen dies mit dem Fehler EINVAL an. Seit Linux 4.5 ist es moglich, die Einstellung O_DIRECT eines Pipe-Dateideskriptors mittels fcntl(2) zu andern. O_NONBLOCK Setzt den Dateistatus-Schalter O_NONBLOCK fur die offene Datei-Deskription, auf die sich der neue Dateideskriptor bezieht. Die Verwendung dieses Schalters spart zusatzliche Aufrufe von fcntl(2), um das gleiche Ergebnis zu erreichen. O_NOTIFICATION_PIPE Seit Linux 5.8 ist ein allgemeiner Benachrichtigungsmechanismus oberhalb von Pipes gebaut worden, bei denen der Kernel Benachrichtungsmeldungen in vom Benutzerraum geoffnete Pipes vebindet. Der Eigentumer der Pipe muss dem Kernel mitteilen, welche Ereignisquellen beobachtet werden sollen. Auch konnen Filter angewendet werden, um auszuwahlen, welche Unterereignisse in die Pipe gelegt werden sollen. RUCKGABEWERT Bei Erfolg wird Null zuruckgegeben. Bei einem Fehler wird -1 zuruckgegeben, errno gesetzt, um den Fehler anzuzeigen und Pipedd bleibt unverandert. Unter Linux (und anderen Systemen) verandert pipe() beim Fehlschlag Pipedd nicht. Eine Anforderung, die dieses Verhalten standardisiert, wurde in POSIX.1-2008 TC2 hinzugefugt. Ein Linux-spezifischer Systemaufruf pipe2() andert entsprechend auch Pipedd beim Fehlschlag nicht. FEHLER EFAULT Pipedd ist ungultig. EINVAL (pipe2()) ungultiger Wert in Schalter EMFILE Die Beschrankung pro Prozess der Anzahl offener Datei-Deskriptoren wurde erreicht. ENFILE Die systemweite Beschrankung fur die Gesamtzahl offener Dateien wurde erreicht. ENFILE Die benutzerbezogene harte Grenze des Speichers, der fur Pipes zugewiesen werden kann, wurde erreicht und der Aufrufende verfugt nicht uber Privilegien; siehe pipe(7). ENOPKG (pipe2()) O_NOTIFICATION_PIPE wurde in Schalter ubergeben und die Unterstutzung fur Benachrichtigungen (CONFIG_WATCH_QUEUE) ist nicht im Kernel einkompiliert. VERSIONEN Das System-V-ABI auf einigen Architekturen erlaubt die Verwendung von mehr als einem Register zum Zuruckliefern mehrerer Werte; eine Reihe von Architekturen (konkret Alpha, IA-64, MIPS, SuperH und SPARC/SPARC64) (mis-)brauchen diese Funktionalitat, um den Systemaufruf pipe() auf eine funktionale Weise zu implementieren: der Aufruf akzeptiert keine Argumente und liefert im Erfolgsfall ein Paar von Dateideskriptoren als Ruckgabewert zuruck. Die Glibc-Wrapperfunktion pipe() geht damit transparent um. Siehe syscall(2) fur Informationen im Hinblick auf die Register, die zur Speicherung des zweiten Dateideskriptors verwandt werden. STANDARDS pipe() POSIX.1-2008. pipe2() Linux. GESCHICHTE pipe() POSIX.1-2001. pipe2() Linux 2.6.27, glibc 2.9. BEISPIELE Das folgende Programm erstellt eine Pipe und erzeugt anschliessend mittels fork(2) einen Kindprozess; das Kind erbt einen kopierten Satz von Dateideskriptoren fur dieselbe pipeline. Danach schliesst jeder Prozess die Dateideskriptoren, die er nicht fur die Pipe benotigt (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. Programmquelltext #include #include #include #include #include int main(int argc, char *argv[]) { int pipefd[2]; char buf; pid_t cpid; if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } if (pipe(pipefd) == -1) { perror("pipe"); 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 schliessen */ 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 schliessen */ 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) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Lars J. Brandt , Martin Eberhard Schauer , Mario Blattermann und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 pipe(2)