.\" -*- coding: UTF-8 -*- .\" This manpage is Copyright (C) 2006 Jens Axboe .\" and Copyright (C) 2006 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH tee 2 "3 мая 2023 г." "Linux man\-pages 6.05.01" .SH ИМЯ tee \- повторяет содержимое канала .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#define _GNU_SOURCE\fP /* см. feature_test_macros(7) */ \fB#include \fP .PP \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 ОПИСАНИЕ .\" 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() повторяет до \fIlen\fP байт данных из канала, на который указывает файловый дескриптор \fIfd_in\fP в канал, на который указывает файловый дескриптор \fIfd_out\fP. Он не потребляет данные, копируемые из \fIfd_in\fP, поэтому эти данные можно копировать последующим вызовом \fBsplice\fP(2). .PP Аргумент \fIflags\fP представляет собой битовую маску, которая составляется логическим сложением (OR) следующих значений: .TP 1.9i \fBSPLICE_F_MOVE\fP В данный момент никак не влияет при указании в \fBtee\fP(); см. \fBsplice\fP(2). .TP \fBSPLICE_F_NONBLOCK\fP Не блокировать ввод\-вывод; подробности в \fBsplice\fP(2). .TP \fBSPLICE_F_MORE\fP В данный момент никак не влияет при указании в \fBtee\fP(), но это может измениться; см. \fBsplice\fP(2). .TP \fBSPLICE_F_GIFT\fP Не используется для \fBtee\fP(); см. \fBvmsplice\fP(2). .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении, \fBtee\fP() возвращает количество байт, которые были повторены из ввода в выводе. Возвращаемое значение 0 означает, что нет данных для передачи, и блокировка не имеет смысла, так как нет процессов\-писателей, подключённых к каналу для записи, на который указывает \fIfd_in\fP. .PP В случае ошибки \fBtee\fP() возвращает \-1, а \fIerrno\fP устанавливается в соответствующее значение. .SH ОШИБКИ .TP \fBEAGAIN\fP В \fIflags\fP указан \fBSPLICE_F_NONBLOCK\fP или один из файловых дескрипторов был помечен как неблокирующий (\fBO_NONBLOCK\fP)\fB,\fP и операция вызвала бы блокировку. .TP \fBEINVAL\fP Значение \fIfd_in\fP или \fIfd_out\fP не указывает на канал; \fIfd_in\fP и \fIfd_out\fP указывают на один и тот же канал. .TP \fBENOMEM\fP Не хватает памяти. .SH СТАНДАРТЫ Linux. .SH ИСТОРИЯ Linux 2.6.17, glibc 2.5. .SH ЗАМЕЧАНИЯ Концептуально, \fBtee\fP() копирует данные между двумя каналами. В реальности, данные не копируются на самом деле: внутри, \fBtee\fP() назначает данные на вывод просто схватывая ссылку из ввода. .SH ПРИМЕРЫ В примере далее показана простая реализация программы \fBtee\fP(1) с помощью системного вызова \fBtee\fP(). Пример использования: .PP .in +4n .EX $ \fBdate | ./a.out out.log | cat\fP Tue Oct 28 10:06:00 CET 2014 $ \fBcat out.log\fP Tue Oct 28 10:06:00 CET 2014 .EE .in .SS "Исходный код программы" .\" SRC BEGIN (tee.c) \& .EX #define _GNU_SOURCE #include #include #include #include #include #include \& int main(int argc, char *argv[]) { int fd; ssize_t len, slen; \& if (argc != 2) { fprintf(stderr, "Usage: %s \en", 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 (;;) { /* * tee stdin to stdout. */ 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; \& /* * Consume stdin by splicing it to a file. */ 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 "СМ. ТАКЖЕ" \fBsplice\fP(2), \fBvmsplice\fP(2), \fBpipe\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Azamat Hackimov , Dmitry Bolkhovskikh , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .