oracular (2) pipe.2.gz

Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       pipe, pipe2 - tworzy potok

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <unistd.h>

       int pipe(int pipefd[2]);

       #define _GNU_SOURCE             /* Zob. feature_test_macros(7) */
       #include <fcntl.h>              /* Definicja stałych O_* */
       #include <unistd.h>

       int pipe2(int pipefd[2], int flags);

       /* Na Alpha, IA-64, MIPS, SuperH i SPARC/SPARC64, pipe() ma poniższy
          prototyp; zob. WERSJE */

       #include <unistd.h>

       struct fd_pair {
       long fd[2];
       };
       struct fd_pair pipe(void);

OPIS

       pipe()  tworzy  potok,  jednokierunkowy  kanał  danych,  służący do komunikacji między procesami. Tablica
       pipefd służy do zwrócenia dwóch deskryptorów pliku odnoszących się do końców potoku. pipefd[0] odnosi się
       do  końca  do odczytu. pipefd[1] odnosi się do końca do zapisu. Dane zapisywane do końca do zapisu potoku
       są buforowane przez jądro, do momentu ich odczytania z końca do odczytu potoku. Więcej szczegółów opisano
       w podręczniku pipe(7).

       Jeśli  flags  ma  wartość  0, to pipe2() jest równoważne pipe(). We flags można określić sumę bitową (OR)
       poniższych wartości, aby uzyskać odmienne zachowanie:

       O_CLOEXEC
              Ustawia znacznik zamknij-przy-wykonaniu (close-on-exec; FD_CLOEXEC) na dwóch nowych  deskryptorach
              pliku.  Powody,  dla  których  może  być  to  przydatne, wskazano w opisie tego samego znacznika w
              podręczniku open(2).

       O_DIRECT (od Linuksa 3.4)
              Tworzy potok, który przeprowadza wejście/wyjście w trybie „pakietowym”. Każdy zapis (write(2))  do
              potoku  jest  traktowany  jako  oddzielny pakiet, a odczyt (read(2)) z potoku odczyta jednocześnie
              pojedynczy pakiet. Proszę zauważyć, że:

              •  Zapis więcej niż PIPE_BUF bajtów (zob. pipe(7)) zostanie podzielony na  kilka  pakietów.  Stała
                 PIPE_BUF jest zdefiniowana w <limits.h>.

              •  Jeśli odczyt (read(2)) określi rozmiar bufora mniejszy niż następny pakiet, to odczytywana jest
                 żądana liczba bajtów, a  dodatkowe  bajty  pakietu  są  odrzucane.  Podanie  rozmiar  bufora  w
                 wielkości  PIPE_BUF  wystarczy do odczytu nawet największych możliwych pakietów (zob. poprzedni
                 punkt).

              •  Pakiety zerowej długości nie są obsługiwane (odczyt — read(2), określający  rozmiar  bufora  na
                 zero, będzie instrukcją pustą i zwróci 0).

              Starsze jądra, które nie obsługują tego znacznika, zasygnalizują ten fakt za pomocą błędu EINVAL.

              Od Linuksa 4.5, można zmienić ustawienie O_DIRECT deskryptora pliku potoku za pomocą fcntl(2).

       O_NONBLOCK
              Ustawia  znacznik  stanu  pliku  O_NONBLOCK  na  opisach  otwartego pliku (OFD), na które wskazują
              deskryptory nowych plików. Można w ten sposób oszczędzić sobie dodatkowych  wywołań  do  fcntl(2),
              uzyskując ten sam rezultat.

       O_NOTIFICATION_PIPE
              Od  Linuksa  5.8,  wokół  potoków  zbudowano  ogólny  mechanizm powiadomień, w którym jądro wplata
              komunikaty z powiadomieniami do potoków otwartych przez przestrzeń użytkownika. Właściciel  potoku
              musi przekazać jądru, jakie źródło zdarzeń ma obserwować oraz jakie filtry mają być zastosowane, w
              celu wybrania zdarzeń podrzędnych, które mają być umieszczone w potoku.

WARTOŚĆ ZWRACANA

       Po pomyślnym zakończeniu zwracane jest zero. W  przypadku  błędu  zwracane  jest  -1  i  ustawiane  errno
       wskazując błąd, a pipefd pozostaje bez zmian.

       W Linuksie (i innych systemach), pipe() nie modyfikuje pipefd w przypadku błędu. Wymaganie standaryzujące
       to zachowanie dodano w normie POSIX.1-2008 TC2. Typowo linuksowe wywołanie systemowe pipe2() również  nie
       modyfikuje pipefd w przypadku błędu.

BŁĘDY

       EFAULT pipefd jest nieprawidłowy.

       EINVAL (pipe2())  Nieprawidłowa wartość we flags.

       EMFILE Zostało osiągnięte ograniczenie na liczbę otwartych deskryptorów plików dla procesu.

       ENFILE Zostało osiągnięte systemowe ograniczenie na całkowitą liczbę otwartych plików.

       ENFILE Osiągnięto  bezwzględny  limit  pamięci  jaką  można  przydzielić  potokom,  a wywołujący nie jest
              uprzywilejowany, zob. pipe(7).

       ENOPKG (pipe2())  We flags podano O_NOTIFICATION_PIPE, a  obsługa  powiadomień  (CONFIG_WATCH_QUEUE)  nie
              została wbudowana w jądro.

WERSJE

       ABI  Systemu  V  na  niektórych  architekturach  umożliwia  używanie  więcej niż jednego rejestru, w celu
       zwracania kilku wartości; wiele architektur (w tym Alpha, IA-64, MIPS, SuperH i SPARC/SPARC64) (nad)używa
       tej  funkcjonalności  w celu implementacji wywołania systemowego pipe() w sposób funkcyjny: wywołanie nie
       przyjmuje żadnych argumentów i zwraca parę deskryptorów pliku w przypadku powodzenia. Funkcja opakowująca
       pipe()  z glibc radzi sobie z tym w sposób przezroczysty. Podręcznik syscall(2) zawiera więcej informacji
       na temat rejestrów używanych do przechowywania drugiego deskryptora pliku.

STANDARDY

       pipe() POSIX.1-2008.

       pipe2()
              Linux.

HISTORIA

       pipe() POSIX.1-2001.

       pipe2()
              Linux 2.6.27, glibc 2.9.

PRZYKŁADY

       Poniższy program tworzy potok, następnie tworzy nowy proces potomny za pomocą fork(2); potomek dziedziczy
       zduplikowany  zestaw deskryptorów pliku, odnoszący się do tego samego potoku. Po wykonaniu fork(2), każdy
       proces zamyka deskryptory pliku,  które  nie  są  potrzebne  potokowi  (zob.  pipe(7)).  Rodzic  zapisuje
       następnie  łańcuch  zawierający  argumenty  wiersza  poleceń  programu do potoku, a potomek odczytuje ten
       łańcuch z potoku bajt po bajcie i wypisuje go na standardowe wyjście.

   Kod źródłowy programu
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
       #include <sys/types.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, "Użycie: %s <łańcuch>\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) {    /* Potomek odczytuje z potoku */
               close(pipefd[1]);  /* Zamknięcie nieużywanego końca do zapisu */

               while (read(pipefd[0], &buf, 1) > 0)
                   write(STDOUT_FILENO, &buf, 1);

               write(STDOUT_FILENO, "\n", 1);
               close(pipefd[0]);
               _exit(EXIT_SUCCESS);

           } else {            /* Rodzic zapisuje argv[1] do potoku */
               close(pipefd[0]);          /* Zamkn. nieuż. końca do odczytu */
               write(pipefd[1], argv[1], strlen(argv[1]));
               close(pipefd[1]);          /* Czytający zobaczy EOF */
               wait(NULL);                /* Czekanie na potomka */
               exit(EXIT_SUCCESS);
           }
       }

ZOBACZ TAKŻE

       fork(2), read(2), socketpair(2), splice(2), tee(2), vmsplice(2), write(2), popen(3), pipe(7)

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika  są:  Przemek  Borys  <pborys@dione.ids.pl>,
       Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją.  Bliższe informacje o warunkach licencji można uzyskać
       zapoznając się z GNU General Public License w wersji  3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  lub
       nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

       Błędy  w  tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy dyskusyjnej ⟨manpages-pl-
       list@lists.sourceforge.net⟩.