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