bionic (2) pipe.2.gz

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

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>.