.\" -*- coding: UTF-8 -*-
.\" This manpage is Copyright (C) 2006 Jens Axboe
.\" and Copyright (C) 2006 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH tee 2 "15 czerwca 2024 r." "Linux man\-pages 6.9.1" 
.SH NAZWA
tee \- powiela zawartość potoku
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#define _GNU_SOURCE\fP         /* Patrz feature_test_macros(7) */
\fB#include <fcntl.h>\fP
.P
\fBssize_t tee(int \fP\fIfd_in\fP\fB, int \fP\fIfd_out\fP\fB, size_t \fP\fIlen\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP
.fi
.\" Return type was long before glibc 2.7
.SH OPIS
.\" Example programs http://brick.kernel.dk/snaps
.\"
.\"
.\" add a "tee(in, out1, out2)" system call that duplicates the pages
.\" (again, incrementing their reference count, not copying the data) from
.\" one pipe to two other pipes.
\fBtee\fP() powiela maksymalnie \fIlen\fP bajtów danych z potoku, do którego
odnosi się deskryptor pliku \fIfd_in\fP, do potoku, do którego odnosi się
deskryptor pliku \fIfd_out\fP. Nie konsumuje danych duplikowanych z \fIfd_in\fP,
zatem dane te można skopiować kolejnym wywołaniem \fBsplice\fP(2).
.P
\fIflags\fP jest maską bitową tworzoną jako suma logiczna (OR) zera lub
większej liczby następujących wartości:
.TP  1.9i
\fBSPLICE_F_MOVE\fP
Obecnie nie wpływa na \fBtee\fP(); zob. \fBsplice\fP(2).
.TP 
\fBSPLICE_F_NONBLOCK\fP
Nie blokuje wejścia/wyjścia; więcej informacji w podręczniku \fBsplice\fP(2).
.TP 
\fBSPLICE_F_MORE\fP
Obecnie nie wpływa na \fBtee\fP(), lecz może być zaimplementowane w
przyszłości; zob. \fBsplice\fP(2).
.TP 
\fBSPLICE_F_GIFT\fP
Nieużywane w \fBtee\fP(); zob. \fBvmsplice\fP(2).
.SH "WARTOŚĆ ZWRACANA"
Po pomyślnym zakończeniu, \fBtee\fP() 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ę \fIfd_in\fP, nie było
zapisujących.
.P
W razie wystąpienia błędu \fBtee\fP zwraca \-1 i ustawia \fIerrno\fP, wskazując
błąd.
.SH BŁĘDY
.TP 
\fBEAGAIN\fP
We \fIflags\fP podano \fBSPLICE_F_NONBLOCK\fP lub jeden z deskryptorów plików
oznaczono jako nieblokujący (\fBO_NONBLOCK\fP), natomiast operacja
spowodowałaby blokowanie.
.TP 
\fBEINVAL\fP
\fIfd_in\fP lub \fIfd_out\fP nie odnoszą się do potoku; albo \fIfd_in\fP i \fIfd_out\fP
odnoszą się do tego samego potoku.
.TP 
\fBENOMEM\fP
Brak pamięci.
.SH STANDARDY
Linux.
.SH HISTORIA
Linux 2.6.17, glibc 2.5.
.SH UWAGI
Kopiowanie danych pomiędzy potokami przez \fBtee\fP() jest tylko konceptem. Tak
naprawdę nie dochodzi do kopiowania: za kulisami \fBtee\fP() przypisuje dane z
wyjścia, jedynie przez przechwycenie odniesienia do wejścia.
.SH PRZYKŁADY
Poniższy przykład implementuje prosty program \fBtee\fP(1) za pomocą wywołania
systemowego \fBtee\fP(). Oto przykład jego użycia:
.P
.in +4n
.EX
$ \fBdate | ./a.out out.log | cat\fP
wto, 28 paź 2014, 10:06:00 CET
$ \fBcat out.log\fP
wto, 28 paź 2014, 10:06:00 CET
.EE
.in
.SS "Kod źródłowy programu"
.\" SRC BEGIN (tee.c)
\&
.EX
#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>\[rs]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);
}
.EE
.\" SRC END
.SH "ZOBACZ TAKŻE"
\fBsplice\fP(2), \fBvmsplice\fP(2), \fBpipe\fP(7)
.PP
.SH TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika:
Michał Kułach <michal.kulach@gmail.com>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
