1. NOM▲
tee - Dupliquer le contenu d'un tube
2. SYNOPSIS ▲
#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().
#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 ▲
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> ».