Provided by: manpages-pl-dev_4.27.0-1_all 

NAZWA
tee - powiela zawartość potoku
BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)
SKŁADNIA
#define _GNU_SOURCE /* Patrz feature_test_macros(7) */ #include <fcntl.h> ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);
OPIS
tee() powiela maksymalnie len bajtów danych z potoku, do którego odnosi się deskryptor pliku fd_in, do potoku, do którego odnosi się deskryptor pliku fd_out. Nie konsumuje danych duplikowanych z fd_in, zatem dane te można skopiować kolejnym wywołaniem splice(2). flags jest maską bitową tworzoną jako suma logiczna (OR) zera lub większej liczby następujących wartości: SPLICE_F_MOVE Obecnie nie wpływa na tee(); zob. splice(2). SPLICE_F_NONBLOCK Nie blokuje wejścia/wyjścia; więcej informacji w podręczniku splice(2). SPLICE_F_MORE Obecnie nie wpływa na tee(), lecz może być zaimplementowane w przyszłości; zob. splice(2). SPLICE_F_GIFT Nieużywane w tee(); zob. vmsplice(2).
WARTOŚĆ ZWRACANA
Po pomyślnym zakończeniu, tee() zwraca liczbę zduplikowanych między wejściem i wyjściem bajtów. Zwracana wartość 0 oznacza, że nie wystąpiły dane do przetransferowania, zatem blokowanie nie miało sensu, ponieważ do końca do zapisu potoku, do którego odnosi się fd_in, nie było zapisujących. W razie wystąpienia błędu tee zwraca -1 i ustawia errno, wskazując błąd.
BŁĘDY
EAGAIN We flags podano SPLICE_F_NONBLOCK lub jeden z deskryptorów plików oznaczono jako nieblokujący (O_NONBLOCK), natomiast operacja spowodowałaby blokowanie. EINVAL fd_in lub fd_out nie odnoszą się do potoku; albo fd_in i fd_out odnoszą się do tego samego potoku. ENOMEM Brak pamięci.
STANDARDY
Linux.
HISTORIA
Linux 2.6.17, glibc 2.5.
UWAGI
Kopiowanie danych pomiędzy potokami przez tee() jest tylko konceptem. Tak naprawdę nie dochodzi do kopiowania: za kulisami tee() przypisuje dane z wyjścia, jedynie przez przechwycenie odniesienia do wejścia.
PRZYKŁADY
Poniższy przykład implementuje prosty program tee(1) za pomocą wywołania systemowego tee(). Oto przykład jego użycia: $ date | ./a.out out.log | cat wto, 28 paź 2014, 10:06:00 CET $ cat out.log wto, 28 paź 2014, 10:06:00 CET Kod źródłowy programu #define _GNU_SOURCE #include <errno.h> #include <fcntl.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char *argv[]) { int fd; ssize_t len, slen; if (argc != 2) { fprintf(stderr, "Użycie: %s <plik>\n", argv[0]); exit(EXIT_FAILURE); } fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); } for (;;) { /* * Użyj tee ze standardowego wejścia do st. wyjścia. */ len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK); if (len < 0) { if (errno == EAGAIN) continue; perror("tee"); exit(EXIT_FAILURE); } if (len == 0) break; /* * Skonsumuj st. wejście dokonując splice do pliku. */ while (len > 0) { slen = splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE); if (slen < 0) { perror("splice"); exit(EXIT_FAILURE); } len -= slen; } } close(fd); exit(EXIT_SUCCESS); }
ZOBACZ TAKŻE
splice(2), vmsplice(2), pipe(7)
TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: 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. Linux man-pages 6.9.1 15 czerwca 2024 r. tee(2)