Scroll to navigation

tee(2) System Calls Manual 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:

Obecnie nie wpływa na tee(); zob. splice(2).
Nie blokuje wejścia/wyjścia; więcej informacji w podręczniku splice(2).
Obecnie nie wpływa na tee(), lecz może być zaimplementowane w przyszłości; zob. splice(2).
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

We flags podano SPLICE_F_NONBLOCK lub jeden z deskryptorów plików oznaczono jako nieblokujący (O_NONBLOCK), natomiast operacja spowodowałaby blokowanie.
fd_in lub fd_out nie odnoszą się do potoku; albo fd_in i fd_out odnoszą się do tego samego potoku.
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.

15 czerwca 2024 r. Linux man-pages 6.9.1