| pipe(2) | System Calls Manual | pipe(2) |
pipe, pipe2 - tworzy potok
Standardowa biblioteka C (libc, -lc)
#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);
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:
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.
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.
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.
#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);
}
}
fork(2), read(2), socketpair(2), splice(2), tee(2), vmsplice(2), write(2), popen(3), pipe(7)
Tłumaczenie niniejszej strony podręcznika: 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 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.
| 15 czerwca 2024 r. | Linux man-pages 6.9.1 |