tee(2) System Calls Manual tee(2) NAZWA tee - powiela zawartosc potoku BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #define _GNU_SOURCE /* Patrz feature_test_macros(7) */ #include ssize_t tee(int fd_in, int fd_out, size_t size, unsigned int flags); OPIS tee() powiela maksymalnie size bajtow danych z potoku, do ktorego odnosi sie deskryptor pliku fd_in, do potoku, do ktorego odnosi sie deskryptor pliku fd_out. Nie konsumuje danych duplikowanych z fd_in, zatem dane te mozna skopiowac kolejnym wywolaniem splice(2). flags jest maska bitowa tworzona jako suma logiczna (OR) zera lub wiekszej liczby nastepujacych wartosci: SPLICE_F_MOVE Obecnie nie wplywa na tee(); zob. splice(2). SPLICE_F_NONBLOCK Nie blokuje wejscia/wyjscia; wiecej informacji w podreczniku splice(2). SPLICE_F_MORE Obecnie nie wplywa na tee(), lecz moze byc zaimplementowane w przyszlosci; zob. splice(2). SPLICE_F_GIFT Nieuzywane w tee(); zob. vmsplice(2). WARTOSC ZWRACANA Po pomyslnym zakonczeniu, tee() zwraca liczbe zduplikowanych miedzy wejsciem i wyjsciem bajtow. Zwracana wartosc 0 oznacza, ze nie wystapily dane do przetransferowania, zatem blokowanie nie mialo sensu, poniewaz do konca do zapisu potoku, do ktorego odnosi sie fd_in, nie bylo zapisujacych. W razie wystapienia bledu tee zwraca -1 i ustawia errno, wskazujac blad. BLEDY EAGAIN We flags podano SPLICE_F_NONBLOCK lub jeden z deskryptorow plikow oznaczono jako nieblokujacy (O_NONBLOCK), natomiast operacja spowodowalaby blokowanie. EINVAL fd_in lub fd_out nie odnosza sie do potoku; albo fd_in i fd_out odnosza sie do tego samego potoku. ENOMEM Brak pamieci. STANDARDY Linux. HISTORIA Linux 2.6.17, glibc 2.5. UWAGI Kopiowanie danych pomiedzy potokami przez tee() jest tylko konceptem. Tak naprawde nie dochodzi do kopiowania: za kulisami tee() przypisuje dane z wyjscia, jedynie przez przechwycenie odniesienia do wejscia. PRZYKLADY Ponizszy przyklad implementuje prosty program tee(1) za pomoca wywolania systemowego tee(). Oto przyklad jego uzycia: $ date | ./a.out out.log | cat; wto, 28 paz 2014, 10:06:00 CET $ cat out.log; wto, 28 paz 2014, 10:06:00 CET Kod zrodlowy programu #define _GNU_SOURCE #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd; ssize_t size, ssize; if (argc != 2) { fprintf(stderr, "Uzycie: %s \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 (;;) { /* * Uzyj tee ze standardowego wejscia do st. wyjscia. */ size = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK); if (size < 0) { if (errno == EAGAIN) continue; perror("tee"); exit(EXIT_FAILURE); } if (size == 0) break; /* * Skonsumuj st. wejscie dokonujac splice do pliku. */ while (size > 0) { ssize = splice(STDIN_FILENO, NULL, fd, NULL, size, SPLICE_F_MOVE); if (ssize < 0) { perror("splice"); exit(EXIT_FAILURE); } size -= ssize; } } close(fd); exit(EXIT_SUCCESS); } ZOBACZ TAKZE splice(2), vmsplice(2), pipe(7) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.15 17 maja 2025 r. tee(2)