1. NOM▲

tee - Dupliquer le contenu d'un tube

2. SYNOPSIS ▲

 
Sélectionnez
#define _GNU_SOURCE         /* Consultez feature_test_macros(7) */
#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);

3. DESCRIPTION ▲

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 ; consultez splice(2).
  • SPLICE_F_NONBLOCK
        Ne pas bloquer pendant les entrées-sorties ; consultez 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 ; consultez splice(2).
  • SPLICE_F_GIFT
        Inutilisé pour tee() ; consultez vmsplice(2).

4. 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.

5. 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.

6. VERSIONS ▲

L'appel système tee() est apparu dans Linux 2.6.17, la glibc le gère depuis la version 2.5.

7. CONFORMITÉ ▲

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

8. 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.

9. EXEMPLE ▲

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

 
Sélectionnez
#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, "Utilisation : %s <fichier>\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);
}

10. VOIR AUSSI ▲

splice(2), vmsplice(2)

11. COLOPHON ▲

Cette page fait partie de la publication 3.52 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/.

12. TRADUCTION ▲

Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

Julien Cristau et l'équipe francophone de traduction de Debian (2006-2009).

Veuillez signaler toute erreur de traduction en écrivant à <>.

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