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