SENDFILE
Section : Manuel du programmeur Linux (
2)
Mise à jour de la version anglaise : 17 décembre 2004
Index
Menu principal
NOM
sendfile - Transfert de données entre descripteurs de fichier
SYNOPSIS
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
DESCRIPTION
sendfile()
copie des données entre deux descripteurs de fichier.
Parce que cette copie est effectuée dans le noyau,
sendfile()
est plus efficace que la combinaison
read(2)
et
write(2)
qui nécessite le transfert des données vers et de l'espace utilisateur.
Le descripteur de fichier
in_fd
doit être ouvert en lecture, et
out_fd
en écriture.
Si
offset
n'est pas NULL, c'est un pointeur sur une variable contenant la tête de
lecture (Ndt : file offset) à partir de laquelle
sendfile()
commencera la lecture dans
in_fd.
Lorsque
sendfile()
se termine, la variable est remplie avec la position de l'octet
immédiatement après le dernier octet lu.
Si
offset
n'est pas NULL,
sendfile()
ne modifie pas la position courante dans le fichier
in_fd ;
autrement, la position courante de la tête de lecture est ajustée
pour refléter le nombre d'octets lus à partir de
in_fd.
L'argument
count
est le nombre d'octets à copier entre les descripteurs de fichier.
Actuellement (Linux 2.6.9),
in_fd
doit correspondre à un fichier supportant les opérations de type
mmap(2)
(c'est-à-dire qu'il ne peut pas être une socket) ; et
out_fd
doit faire référence à une socket.
Les applications peuvent se replier sur
read(2)/write(2)
dans le cas où
sendfile()
échoue avec les erreurs
EINVAL
ou
ENOSYS.
VALEUR RENVOYÉE
Si le transfert a réussi, le nombre d'octets écrits dans
out_fd
est renvoyé.
Sinon,
sendfile()
renvoie -1, et
errno
est configuré.
ERREURS
- EAGAIN
-
L'entrée-sortie non bloquante a été choisie avec
O_NONBLOCK
et l'écriture devrait bloquer.
- EBADF
-
Le fichier d'entrée n'est pas ouvert en lecture,
ou celui de sortie en écriture.
- EFAULT
-
Mauvaise adresse.
- EINVAL
-
Le descripteur est invalide ou verrouillé, ou une opération de type
mmap(2)
n'est pas disponible pour
in_fd.
- EIO
-
Erreur d'entrée-sortie pendant la lecture depuis
in_fd.
- ENOMEM
-
Mémoire insuffisante pour lire depuis
in_fd.
VERSIONS
L'appel système
sendfile()
est une nouveauté de Linux 2.2.
Le fichier d'entête
<sys/sendfile.h>
est présent depuis la glibc 2.1.
CONFORMITÉ
Pas spécifié dans POSIX.1-2001, ni dans d'autres normes.
D'autres systèmes Unix implémentent
sendfile()
avec d'autres sémantiques
et d'autres prototypes.
Il ne faut pas l'utiliser dans un programme portable.
NOTES
Si vous voulez utiliser
sendfile()
pour envoyer un fichier au travers
d'une socket TCP, tout en le précédant de données d'entête,
voyez l'option
TCP_CORK
de
tcp(7)
pour minimiser le nombre de paquets, et optimiser les performances.
Dans Linux 2.4 et antérieurs,
out_fd
pouvait faire référence à un fichier régulier et
sendfile()
modifiait la position de la tête de lecture sur ce fichier.
VOIR AUSSI
mmap(2),
open(2),
socket(2),
splice(2)
TRADUCTION
Ce document est une traduction réalisée par Christophe Blaess
<http://www.blaess.fr/christophe/> le 4 janvier 2000
et révisée le 24 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 sendfile ».
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
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 24 juin 2008