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

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)