SENDFILE(2)

NOM
sendfile - Transfert de données entre descripteurs de fichiers

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 un descripteur de fichier et un autre. 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 fichiers. Actuellement (Linux 2.6.9) : in_fd doit correspondre à un fichier qui supporte 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 souhaiter 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 pourrait 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.

ENOMEM
    Mémoire insuffisante pour lire depuis in_fd.

EIO Erreur d'entrée-sortie pendant la lecture depuis in_fd.

VERSIONS
L'appel système sendfile() est une nouveauté de Linux 2.2. Le fichier d'en-tê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
L'appel sendfile() ne modifie pas la position courante dans le fichier in_fd, mais modifie celle de out_fd. 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'en-tête, voyez l'option TCP_CORK de tcp(7) pour minimiser le nombre de paquets, et optimiser les performances. Dans Linux 2.4 et précédents, 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 10 décembre 2007.

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.