TEE(2)

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 22 décembre 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.