Movatterモバイル変換


[0]ホーム

URL:


man7.org > Linux >man-pages

Linux/UNIX system programming training


tee(2) — Linux manual page

NAME |LIBRARY |SYNOPSIS |DESCRIPTION |RETURN VALUE |ERRORS |STANDARDS |HISTORY |NOTES |EXAMPLES |SEE ALSO |COLOPHON

tee(2)                     System Calls Manualtee(2)

NAME        top

       tee - duplicating pipe content

LIBRARY        top

       Standard C library (libc,-lc)

SYNOPSIS        top

#define _GNU_SOURCE/* See feature_test_macros(7) */#include <fcntl.h>ssize_t tee(intfd_in, intfd_out, size_tsize, unsigned intflags);

DESCRIPTION        top

tee() duplicates up tosize bytes of data from the pipe referred       to by the file descriptorfd_in to the pipe referred to by the       file descriptorfd_out.  It does not consume the data that is       duplicated fromfd_in; therefore, that data can be copied by a       subsequentsplice(2).flags is a bit mask that is composed by ORing together zero or       more of the following values:SPLICE_F_MOVE              Currently has no effect fortee(); seesplice(2).SPLICE_F_NONBLOCK              Do not block on I/O; seesplice(2) for further details.SPLICE_F_MORE              Currently has no effect fortee(), but may be implemented              in the future; seesplice(2).SPLICE_F_GIFT              Unused fortee(); seevmsplice(2).

RETURN VALUE        top

       Upon successful completion,tee() returns the number of bytes that       were duplicated between the input and output.  A return value of 0       means that there was no data to transfer, and it would not make       sense to block, because there are no writers connected to the       write end of the pipe referred to byfd_in.       On error,tee() returns -1 anderrno is set to indicate the error.

ERRORS        top

EAGAIN SPLICE_F_NONBLOCKwas specified inflags or one of the file              descriptors had been marked as nonblocking (O_NONBLOCK),              and the operation would block.EINVALfd_in orfd_out does not refer to a pipe; orfd_in andfd_out refer to the same pipe.ENOMEMOut of memory.

STANDARDS        top

       Linux.

HISTORY        top

       Linux 2.6.17, glibc 2.5.

NOTES        top

       Conceptually,tee() copies the data between the two pipes.  In       reality no real data copying takes place though: under the covers,tee() assigns data to the output by merely grabbing a reference to       the input.

EXAMPLES        top

       The example below implements a basictee(1) program using thetee() system call.  Here is an example of its use:           $date | ./a.out out.log | cat;           Tue Oct 28 10:06:00 CET 2014           $cat out.log;           Tue Oct 28 10:06:00 CET 2014Program source       #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  size, ssize;           if (argc != 2) {               fprintf(stderr, "Usage: %s <file>\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 (;;) {               /*                * tee stdin to stdout.                */               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;               /*                * Consume stdin by splicing it to a file.                */               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);       }

SEE ALSO        top

splice(2),vmsplice(2),pipe(7)

COLOPHON        top

       This page is part of theman-pages (Linux kernel and C library       user-space interface documentation) project.  Information about       the project can be found at        ⟨https://www.kernel.org/doc/man-pages/⟩.  If you have a bug report       for this manual page, see       ⟨https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/CONTRIBUTING⟩.       This page was obtained from the tarball man-pages-6.15.tar.gz       fetched from       ⟨https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/⟩ on       2025-08-11.  If you discover any rendering problems in this HTML       version of the page, or you believe there is a better or more up-       to-date source for the page, or you have corrections or       improvements to the information in this COLOPHON (which isnot       part of the original manual page), send a mail to       man-pages@man7.orgLinux man-pages 6.15            2025-05-17tee(2)

Pages that refer to this page:io_uring_enter2(2)io_uring_enter(2)pipe(2)splice(2)syscalls(2)vmsplice(2)io_uring_prep_tee(3)pipe(7)



HTML rendering created 2025-09-06 byMichael Kerrisk, author ofThe Linux Programming Interface.

For details of in-depthLinux/UNIX system programming training courses that I teach, lookhere.

Hosting byjambit GmbH.

Cover of TLPI


[8]ページ先頭

©2009-2025 Movatter.jp