tee

Autres langues

Langue: fr

Version: 28 avril 2006 (mandriva - 01/05/08)

Autres sections - même nom

Section: 2 (Appels système)

NOM

tee - Dupliquer le contenu d'un tube

SYNOPSIS

 #define _GNU_SOURCE
 #include <fcntl.h>
 
 long tee(int fd_in, int fd_out, size_t len, unsigned int flags);
 

DESCRIPTION

tee() duplique jusqu'à len octets de données à partir du tube référencé par le descripteur de fichier fd_in vers le tube référencé par le descripteur de fichier fd_out. Il ne consomme pas les données dupliquées depuis fd_in ; ainsi, ces données pourront être copiées par un appel ultérieur à splice(2).

flags est une série d'attributs modificateurs qui partage le même espace de nommage avec splice(2) et vmsplice(2) :

SPLICE_F_MOVE
Actuellement sans effet pour tee() ; voir splice(2).
SPLICE_F_NONBLOCK
Ne pas bloquer sur les E/S ; voir splice(2) pour plus de détails.
SPLICE_F_MORE
Actuellement sans effet pour tee(), mais peut être implémenté dans le futur ; voir splice(2).
SPLICE_F_GIFT
Inutilisé pour tee() ; voir vmsplice(2).

VALEUR RENVOYÉE

En cas de réussite, tee() renvoie le nombre d'octets dupliqués entre l'entrée et la sortie. Une valeur de retour nulle signifie qu'il n'y avait pas de donnée à transférer, et qu'il n'y aurait aucun sens à bloquer étant donné qu'il n'y a pas d'écrivain connecté du coté écriture du tube référencé par fd_in.

En cas d'erreur, tee() renvoie -1 et errno est positionnée en conséquence pour indiquer l'erreur.

ERREURS

EINVAL
fd_in ou fd_out ne fait pas référence à un tube ; ou fd_in et fd_out font référence au même tube.
ENOMEM
Pas assez de mémoire.

VERSIONS

L'appel système tee(2) est apparu pour la première fois 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 réalité, aucune donnée n'est réellement copiée : tee() affecte les données à la sortie en prenant une référence sur l'entrée.

EXEMPLE

L'exemple suivant implémente un programme basique tee(1) en utilisant l'appel système tee(2).
 
 #define _GNU_SOURCE
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <assert.h>
 #include <errno.h>
 #include <limits.h>
 
 int
 main(int argc, char *argv[])
 {
     int fd;
     int len, slen;
 
     assert(argc == 2);
 
     fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
     if (fd == -1) {
         perror("open");
         exit(EXIT_FAILURE);
     }
 
     do {
         /*
          * dupliquer stdin sur stdout.
          */
         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;
 
         /*
          * 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");
                 break;
             }
             len -= slen;
         }
     } while (1);
 
     close(fd);
     exit(EXIT_SUCCESS);
 }
 

VOIR AUSSI

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

TRADUCTION

Ce document est une traduction réalisée par Alain Portal <aportal AT univ-montp2 DOT fr> le 24 octobre 2007 et révisée le 26 novembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 tee ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.