Loading

NOM

       tee - Dupliquer le contenu d’un tube

SYNOPSIS

       #define _GNU_SOURCE
       #include <fcntl.h>

       ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);

       tee()  duplique  jusqu’à  len  octets  de  données  du  tube  auquel le
       descripteur de fichier fd_in fait référence vers le tube référencé  par
       fd_out.  Il  ne  consomme  pas  les  données qui sont dupliquées depuis
       fd_in ; ces données peuvent donc être copiées  par  un  futur  appel  à
       splice(2).

       flags  est  un  ensemble  de paramètres modificateurs, dont l’espace de
       nommage est partagé avec splice(2) et vmsplice(2) :

       SPLICE_F_MOVE      N’a  pas  d’effet  pour  tee()  actuellement ;  voir
                          splice(2).

       SPLICE_F_NONBLOCK  Ne  pas  bloquer  pendant les entrées-sorties ; voir
                          splice(2) pour plus de détails.

       SPLICE_F_MORE      N’a  pas  d’effet  pour  tee()  actuellement,   mais
                          pourrait être implémenté un jour ; voir splice(2).

       SPLICE_F_GIFT      Inutilisé pour tee() ; voir vmsplice(2).

VALEUR RENVOYÉE

       En  cas de succès, tee() renvoie le nombre d’octets dupliqués entre les
       tubes d’entrée et de sortie. La valeur de retour 0 signifie  qu’il  n’y
       avait  aucune  donnée à transférer, et que bloquer n’aurait pas de sens
       car il n’y a aucun écrivain connecté à l’extrémité d’écriture  du  tube
       référencé par fd_in.

       En cas d’erreur, tee() renvoie -1 et errno contient le code d’erreur.

ERREURS

       EINVAL fd_in  ou  fd_out ne correspond pas à un tube ; ou bien fd_in et
              fd_out font référence au même tube.

       ENOMEM Plus de mémoire disponible.

VERSIONS

       L’appel système tee() est apparu dans Linux 2.6.17.

CONFORMITÉ

       Cet appel système est spécifique à Linux.

NOTES

       Conceptuellement, tee() copie les données entre deux tubes. En fait, il
       n’y  a  pas  de  réelle copie de données : tee() attache les données au
       tube de sortie en prenant une référence sur les données en entrée.

EXEMPLE

       L’exemple suivant implémente une version basique du programme tee(1) en
       utilisant l’appel système tee().

       #define _GNU_SOURCE
       #include <fcntl.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <errno.h>
       #include <limits.h>

       int
       main(int argc, char *argv[])
       {
           int fd;
           int len, slen;

           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);
           }

           do {
               /*
                * Duplique l’entrée standard dans la sortie standard.
                */
               len = tee(STDIN_FILENO, STDOUT_FILENO,
                         INT_MAX, SPLICE_F_NONBLOCK);

               if (len < 0) {
                   if (errno == EAGAIN)
                       continue;
                   perror("tee");
                   exit(EXIT_FAILURE);
               } else
                   if (len == 0)
                       break;

               /*
                * Consomme l’entrée standard en la raccordant à un fichier.
                */
               while (len > 0) {
                   slen = splice(STDIN_FILENO, NULL, fd, NULL,
                                 len, SPLICE_F_MOVE);
                   if (slen < 0) {
                       perror("splice");
                       break;
                   }
                   len -= slen;
               }
           } while (1);

           close(fd);
           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       splice(2), vmsplice(2), feature_test_macros(7)

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.23 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       être       trouvées      à      l’adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Cette page de manuel a été traduite et est maintenue par Julien Cristau
       <julien.cristau@ens-lyon.org>  et l’équipe francophone de traduction de
       Debian.

       Veuillez  signaler  toute  erreur   de   traduction   en   écrivant   à
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de  ce  document
       en utilisant la commande « man -L C <section> <page_de_man> ».