TEE

Section : Manuel du programmeur Linux (2)
Mise à jour de la version anglaise : 28 avril 2006
Index Menu principal  

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 dont l'espace de nommage est partagé 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 entrées-sorties ; voir splice(2) pour plus de détails.
SPLICE_F_MORE
Actuellement sans effet pour tee(), 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 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 aucune donnée à transférer, et que bloquer n'aurait pas de sens étant donné qu'il n'y a pas d'écrivain connecté à l'extrémité écriture du tube référencé par fd_in.

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

ERREURS

EINVAL
fd_in ou fd_out ne fait pas référence à un tube ; ou bien 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() a été introduit dans le noyau Linux dans sa version 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 vraiement 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 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 <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 l'entrée standard sur 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)  

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 23 juin 2008.

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.

 

Index

NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
VERSIONS
CONFORMITÉ
NOTES
EXEMPLE
VOIR AUSSI
TRADUCTION

Dernière mise à jour : 23 juin 2008