pipe(2) System Calls Manual pipe(2) NAZWA pipe, pipe2 - tworzy potok BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int pipe(int pipefd[2]); #define _GNU_SOURCE /* Zob. feature_test_macros(7) */ #include /* Definicja stalych O_* */ #include int pipe2(int pipefd[2], int flags); /* Na Alpha, IA-64, MIPS, SuperH i SPARC/SPARC64, pipe() ma ponizszy prototyp; zob. WERSJE */ #include struct fd_pair { long fd[2]; }; struct fd_pair pipe(void); OPIS pipe() tworzy potok, jednokierunkowy kanal danych, sluzacy do komunikacji miedzy procesami. Tablica pipefd sluzy do zwrocenia dwoch deskryptorow pliku odnoszacych sie do koncow potoku. pipefd[0] odnosi sie do konca do odczytu. pipefd[1] odnosi sie do konca do zapisu. Dane zapisywane do konca do zapisu potoku sa buforowane przez jadro, do momentu ich odczytania z konca do odczytu potoku. Wiecej szczegolow opisano w podreczniku pipe(7). Jesli flags ma wartosc 0, to pipe2() jest rownowazne pipe(). We flags mozna okreslic sume bitowa (OR) ponizszych wartosci, aby uzyskac odmienne zachowanie: O_CLOEXEC Ustawia znacznik zamknij-przy-wykonaniu (close-on-exec; FD_CLOEXEC) na dwoch nowych deskryptorach pliku. Powody, dla ktorych moze byc to przydatne, wskazano w opisie tego samego znacznika w podreczniku open(2). O_DIRECT (od Linuksa 3.4) Tworzy potok, ktory przeprowadza wejscie/wyjscie w trybie ,,pakietowym". Kazdy zapis (write(2)) do potoku jest traktowany jako oddzielny pakiet, a odczyt (read(2)) z potoku odczyta jednoczesnie pojedynczy pakiet. Prosze zauwazyc, ze: o Zapis wiecej niz PIPE_BUF bajtow (zob. pipe(7)) zostanie podzielony na kilka pakietow. Stala PIPE_BUF jest zdefiniowana w . o Jesli odczyt (read(2)) okresli rozmiar bufora mniejszy niz nastepny pakiet, to odczytywana jest zadana liczba bajtow, a dodatkowe bajty pakietu sa odrzucane. Podanie rozmiar bufora w wielkosci PIPE_BUF wystarczy do odczytu nawet najwiekszych mozliwych pakietow (zob. poprzedni punkt). o Pakiety zerowej dlugosci nie sa obslugiwane (odczyt -- read(2), okreslajacy rozmiar bufora na zero, bedzie instrukcja pusta i zwroci 0). Starsze jadra, ktore nie obsluguja tego znacznika, zasygnalizuja ten fakt za pomoca bledu EINVAL. Od Linuksa 4.5, mozna zmienic ustawienie O_DIRECT deskryptora pliku potoku za pomoca fcntl(2). O_NONBLOCK Ustawia znacznik stanu pliku O_NONBLOCK na opisach otwartego pliku (OFD), na ktore wskazuja deskryptory nowych plikow. Mozna w ten sposob oszczedzic sobie dodatkowych wywolan do fcntl(2), uzyskujac ten sam rezultat. O_NOTIFICATION_PIPE Od Linuksa 5.8, wokol potokow zbudowano ogolny mechanizm powiadomien, w ktorym jadro wplata komunikaty z powiadomieniami do potokow otwartych przez przestrzen uzytkownika. Wlasciciel potoku musi przekazac jadru, jakie zrodlo zdarzen ma obserwowac oraz jakie filtry maja byc zastosowane, w celu wybrania zdarzen podrzednych, ktore maja byc umieszczone w potoku. WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracane jest zero. W przypadku bledu zwracane jest -1 i ustawiane errno wskazujac blad, a pipefd pozostaje bez zmian. W Linuksie (i innych systemach), pipe() nie modyfikuje pipefd w przypadku bledu. Wymaganie standaryzujace to zachowanie dodano w normie POSIX.1-2008 TC2. Typowo linuksowe wywolanie systemowe pipe2() rowniez nie modyfikuje pipefd w przypadku bledu. BLEDY EFAULT pipefd jest nieprawidlowy. EINVAL (pipe2()) Nieprawidlowa wartosc we flags. EMFILE Zostalo osiagniete ograniczenie na liczbe otwartych deskryptorow plikow dla procesu. ENFILE Zostalo osiagniete systemowe ograniczenie na calkowita liczbe otwartych plikow. ENFILE Osiagnieto bezwzgledny limit pamieci jaka mozna przydzielic potokom, a wywolujacy nie jest uprzywilejowany, zob. pipe(7). ENOPKG (pipe2()) We flags podano O_NOTIFICATION_PIPE, a obsluga powiadomien (CONFIG_WATCH_QUEUE) nie zostala wbudowana w jadro. WERSJE ABI Systemu V na niektorych architekturach umozliwia uzywanie wiecej niz jednego rejestru, w celu zwracania kilku wartosci; wiele architektur (w tym Alpha, IA-64, MIPS, SuperH i SPARC/SPARC64) (nad)uzywa tej funkcjonalnosci w celu implementacji wywolania systemowego pipe() w sposob funkcyjny: wywolanie nie przyjmuje zadnych argumentow i zwraca pare deskryptorow pliku w przypadku powodzenia. Funkcja opakowujaca pipe() z glibc radzi sobie z tym w sposob przezroczysty. Podrecznik syscall(2) zawiera wiecej informacji na temat rejestrow uzywanych 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. PRZYKLADY Ponizszy program tworzy potok, nastepnie tworzy nowy proces potomny za pomoca fork(2); potomek dziedziczy zduplikowany zestaw deskryptorow pliku, odnoszacy sie do tego samego potoku. Po wykonaniu fork(2), kazdy proces zamyka deskryptory pliku, ktore nie sa potrzebne potokowi (zob. pipe(7)). Rodzic zapisuje nastepnie lancuch zawierajacy argumenty wiersza polecen programu do potoku, a potomek odczytuje ten lancuch z potoku bajt po bajcie i wypisuje go na standardowe wyjscie. Kod zrodlowy programu #include #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) { /* Child reads from pipe */ close(pipefd[1]); /* Close unused write end */ while (read(pipefd[0], &buf, 1) > 0) write(STDOUT_FILENO, &buf, 1); write(STDOUT_FILENO, "\n", 1); close(pipefd[0]); _exit(EXIT_SUCCESS); } else { /* Parent writes argv[1] to pipe */ close(pipefd[0]); /* Close unused read end */ write(pipefd[1], argv[1], strlen(argv[1])); close(pipefd[1]); /* Reader will see EOF */ wait(NULL); /* Wait for child */ exit(EXIT_SUCCESS); } } ZOBACZ TAKZE fork(2), read(2), socketpair(2), splice(2), tee(2), vmsplice(2), write(2), popen(3), pipe(7) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.9.1 15 czerwca 2024 r. pipe(2)