.\" -*- coding: UTF-8 -*-
.\" Copyright (C) 2005, 2008, Michael Kerrisk <mtk.manpages@gmail.com>
.\" (A few fragments remain from an earlier (1992) version by
.\" Drew Eckhardt <drew@cs.colorado.edu>.)
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\" Modified by Michael Haardt <michael@moria.de>
.\" Modified 1993-07-23 by Rik Faith <faith@cs.unc.edu>
.\" Modified 1996-10-22 by Eric S. Raymond <esr@thyrsus.com>
.\" Modified 2004-06-17 by Michael Kerrisk <mtk.manpages@gmail.com>
.\" Modified 2005, mtk: added an example program
.\" Modified 2008-01-09, mtk: rewrote DESCRIPTION; minor additions
.\"     to EXAMPLE text.
.\" 2008-10-10, mtk: add description of pipe2()
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH pipe 2 "15 czerwca 2024 r." "Linux man\-pages 6.9.1" 
.SH NAZWA
pipe, pipe2 \- tworzy potok
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#include <unistd.h>\fP
.P
\fBint pipe(int \fP\fIpipefd\fP\fB[2]);\fP
.P
\fB#define _GNU_SOURCE\fP             /* Zob. feature_test_macros(7) */
\fB#include <fcntl.h>\fP              /* Definicja stałych \fBO_*\fP */
\fB#include <unistd.h>\fP
.P
\fBint pipe2(int \fP\fIpipefd\fP\fB[2], int \fP\fIflags\fP\fB);\fP
.P
/* Na Alpha, IA\-64, MIPS, SuperH i SPARC/SPARC64, pipe() ma poniższy
   prototyp; zob. WERSJE */
.P
\fB#include <unistd.h>\fP
.P
\fBstruct fd_pair {\fP
\fBlong fd[2];\fP
\fB};\fP
\fBstruct fd_pair pipe(void);\fP
.fi
.SH OPIS
\fBpipe\fP() tworzy potok, jednokierunkowy kanał danych, służący do komunikacji
między procesami. Tablica \fIpipefd\fP służy do zwrócenia dwóch deskryptorów
pliku odnoszących się do końców potoku. \fIpipefd[0]\fP odnosi się do końca do
odczytu. \fIpipefd[1]\fP 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
\fBpipe\fP(7).
.P
Jeśli \fIflags\fP ma wartość 0, to \fBpipe2\fP() jest równoważne \fBpipe\fP(). We
\fIflags\fP można określić sumę bitową (OR) poniższych wartości, aby uzyskać
odmienne zachowanie:
.TP 
\fBO_CLOEXEC\fP
Ustawia znacznik zamknij\-przy\-wykonaniu (close\-on\-exec; \fBFD_CLOEXEC\fP) na
dwóch nowych deskryptorach pliku. Powody, dla których może być to przydatne,
wskazano w opisie tego samego znacznika w podręczniku \fBopen\fP(2).
.TP 
\fBO_DIRECT\fP (od Linuksa 3.4)
.\" commit 9883035ae7edef3ec62ad215611cb8e17d6a1a5d
Tworzy potok, który przeprowadza wejście/wyjście w trybie
\[Bq]pakietowym\[rq]. Każdy zapis (\fBwrite\fP(2)) do potoku jest traktowany
jako oddzielny pakiet, a odczyt (\fBread\fP(2)) z potoku odczyta jednocześnie
pojedynczy pakiet. Proszę zauważyć, że:
.RS
.IP \[bu] 3
Zapis więcej niż \fBPIPE_BUF\fP bajtów (zob. \fBpipe\fP(7)) zostanie podzielony na
kilka pakietów. Stała \fBPIPE_BUF\fP jest zdefiniowana w \fI<limits.h>\fP.
.IP \[bu]
Jeśli odczyt (\fBread\fP(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 \fBPIPE_BUF\fP wystarczy do
odczytu nawet największych możliwych pakietów (zob. poprzedni punkt).
.IP \[bu]
Pakiety zerowej długości nie są obsługiwane (odczyt \[em] \fBread\fP(2),
określający rozmiar bufora na zero, będzie instrukcją pustą i zwróci 0).
.RE
.IP
Starsze jądra, które nie obsługują tego znacznika, zasygnalizują ten fakt za
pomocą błędu \fBEINVAL\fP.
.IP
.\" commit 0dbf5f20652108106cb822ad7662c786baaa03ff
.\" FIXME . But, it is not possible to specify O_DIRECT when opening a FIFO
Od Linuksa 4.5, można zmienić ustawienie \fBO_DIRECT\fP deskryptora pliku
potoku za pomocą \fBfcntl\fP(2).
.TP 
\fBO_NONBLOCK\fP
Ustawia znacznik stanu pliku \fBO_NONBLOCK\fP 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 \fBfcntl\fP(2), uzyskując ten sam rezultat.
.TP 
\fBO_NOTIFICATION_PIPE\fP
.\" commit c73be61cede5882f9605a852414db559c0ebedfd
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.
.SH "WARTOŚĆ ZWRACANA"
Po pomyślnym zakończeniu zwracane jest zero. W przypadku błędu zwracane jest
\-1 i ustawiane \fIerrno\fP wskazując błąd, a \fIpipefd\fP pozostaje bez zmian.
.P
.\" http://austingroupbugs.net/view.php?id=467
W Linuksie (i innych systemach), \fBpipe\fP() nie modyfikuje \fIpipefd\fP w
przypadku błędu. Wymaganie standaryzujące to zachowanie dodano w normie
POSIX.1\-2008 TC2. Typowo linuksowe wywołanie systemowe \fBpipe2\fP() również
nie modyfikuje \fIpipefd\fP w przypadku błędu.
.SH BŁĘDY
.TP 
\fBEFAULT\fP
\fIpipefd\fP jest nieprawidłowy.
.TP 
\fBEINVAL\fP
(\fBpipe2\fP())  Nieprawidłowa wartość we \fIflags\fP.
.TP 
\fBEMFILE\fP
Zostało osiągnięte ograniczenie na liczbę otwartych deskryptorów plików dla
procesu.
.TP 
\fBENFILE\fP
Zostało osiągnięte systemowe ograniczenie na całkowitą liczbę otwartych
plików.
.TP 
\fBENFILE\fP
Osiągnięto bezwzględny limit pamięci jaką można przydzielić potokom, a
wywołujący nie jest uprzywilejowany, zob. \fBpipe\fP(7).
.TP 
\fBENOPKG\fP
(\fBpipe2\fP())  We \fIflags\fP podano \fBO_NOTIFICATION_PIPE\fP, a obsługa
powiadomień (\fBCONFIG_WATCH_QUEUE\fP) nie została wbudowana w jądro.
.SH WERSJE
.\" See http://math-atlas.sourceforge.net/devel/assembly/64.psabi.1.33.ps.Z
.\" for example, section 3.2.1 "Registers and the Stack Frame".
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 \fBpipe\fP() w sposób funkcyjny:
wywołanie nie przyjmuje żadnych argumentów i zwraca parę deskryptorów pliku
w przypadku powodzenia. Funkcja opakowująca \fBpipe\fP() z glibc radzi sobie z
tym w sposób przezroczysty. Podręcznik \fBsyscall\fP(2) zawiera więcej
informacji na temat rejestrów używanych do przechowywania drugiego
deskryptora pliku.
.SH STANDARDY
.TP 
\fBpipe\fP()
POSIX.1\-2008.
.TP 
\fBpipe2\fP()
Linux.
.SH HISTORIA
.TP 
\fBpipe\fP()
POSIX.1\-2001.
.TP 
\fBpipe2\fP()
Linux 2.6.27, glibc 2.9.
.SH PRZYKŁADY
.\" fork.2 refers to this example program.
Poniższy program tworzy potok, następnie tworzy nowy proces potomny za
pomocą \fBfork\fP(2); potomek dziedziczy zduplikowany zestaw deskryptorów
pliku, odnoszący się do tego samego potoku. Po wykonaniu \fBfork\fP(2), każdy
proces zamyka deskryptory pliku, które nie są potrzebne potokowi
(zob. \fBpipe\fP(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.
.SS "Kod źródłowy programu"
.\" SRC BEGIN (pipe.c)
.EX
#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>\[rs]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, "\[rs]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);
    }
}
.EE
.\" SRC END
.SH "ZOBACZ TAKŻE"
\fBfork\fP(2), \fBread\fP(2), \fBsocketpair\fP(2), \fBsplice\fP(2), \fBtee\fP(2),
\fBvmsplice\fP(2), \fBwrite\fP(2), \fBpopen\fP(3), \fBpipe\fP(7)
.PP
.SH 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>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
