tee(2)

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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.