sendfile(2) System Calls Manual sendfile(2) NOM sendfile - Transfert de donnees entre descripteurs de fichier BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include ssize_t sendfile(int out_fd, int in_fd, off_t *_Nullable offset, size_t count); DESCRIPTION sendfile() copie des donnees entre deux descripteurs de fichier. Comme la copie est assuree a l'interieur du noyau, sendfile() est plus efficace que la combinaison read(2)/write(2) qui exige le transfert des donnees entre l'espace noyau et l'espace utilisateur. in_fd doit etre un descripteur de fichier ouvert en lecture et out_fd un descripteur ouvert en ecriture. Si offset n'est pas NULL, c'est un pointeur sur une variable contenant la tete de lecture (Ndt : file offset) a partir de laquelle sendfile() commencera la lecture dans in_fd. Lorsque sendfile() se termine, la variable est remplie avec la position de l'octet immediatement apres le dernier octet lu. Si offset n'est pas NULL, sendfile() ne modifie pas la position actuelle dans le fichier in_fd ; autrement, la position actuelle de la tete de lecture est ajustee pour refleter le nombre d'octets lus a partir de in_fd. Si offset est NULL, les donnees sont lues dans in_fd a partir de la position actuelle de la tete de lecture et celle-ci sera ajustee par l'appel. L'argument count est le nombre d'octets a copier entre les descripteurs de fichiers. L'argument in_fd doit correspondre a un fichier prenant en charge les operations de type mmap(2) et ne peut donc pas etre un socket. Sauf depuis Linux 5.12 et si out_fd est un tube, auquel cas sendfile() se simplifie en splice(2) et ses restrictions s'appliquent. Avant Linux 2.6.33, out_fd doit correspondre a un socket. Depuis Linux 2.6.33, ce peut etre n'importe quel fichier. Si c'est un fichier adressable, sendfile() modifie la position de tete de lecture en consequence. VALEUR RENVOYEE Si le transfert a reussi, le nombre d'octets ecrits dans out_fd est renvoye. Remarquez qu'un appel a sendfile() reussi peut ecrire moins d'octets que demande, l'appelant doit se preparer a reiterer l'appel en cas de donnees non envoyees. Voir aussi les NOTES. En cas d'erreur, la valeur de retour est -1 et errno est definie pour preciser l'erreur. ERREURS EAGAIN L'ecriture est non bloquante (attribut O_NONBLOCK du descripteur) et l'operation devrait bloquer. EBADF Le fichier d'entree n'est pas ouvert en lecture ou celui de sortie en ecriture. EFAULT Un pointeur se trouve en dehors de l'espace d'adressage. EINVAL Le descripteur n'est pas valable ou est verrouille, ou une operation de type mmap(2) n'est pas disponible sur in_fd, ou bien count est negatif. EINVAL out_fd a un drapeau O_APPEND positionne. Cela n'est actuellement pas gere par sendfile(). EIO Erreur pendant la lecture depuis in_fd. ENOMEM Memoire insuffisante pour lire depuis in_fd. EOVERFLOW count est trop grand, l'operation ferait depasser la taille maximale du fichier d'entree ou de sortie. ESPIPE offset n'est pas NULL mais le fichier d'entree n'est pas adressable. VERSIONS D'autres systemes UNIX implementent sendfile() avec d'autres semantiques, et d'autres prototypes. Il ne faut pas l'utiliser dans un programme portable. STANDARDS Aucun HISTORIQUE Linux 2.2, glibc 2.1. Sous Linux 2.4 et precedents, out_fd pouvait aussi correspondre a un fichier ordinaire, cette possibilite a disparu dans la serie 2.6.3 du noyau Linux, puis retablie dans Linux 2.6.33. L'appel systeme original de Linux sendfile() ne permettait pas de gerer les positions dans les gros fichiers. En consequence, Linux 2.4 a ajoute sendfile64(), avec un type elargi pour le parametre offset. La fonction sendfile() de la glibc qui l'encapsule gere de maniere transparente ces differences entre noyaux. NOTES sendfile() transferera un maximum de 0x7ffff000 (2 147 479 552) octets et renvoie le nombre d'octets transferes (cela est vrai tant pour des systemes 32 bits que 64 bits). Si vous voulez utiliser sendfile() pour envoyer un fichier au travers d'un socket TCP, tout en le precedant de donnees d'en-tete, voyez l'option TCP_CORK de tcp(7) pour minimiser le nombre de paquets, et optimiser les performances. Les applications peuvent se rabattre sur read(2) et write(2) au cas ou sendfile() echoue avec EINVAL ou ENOSYS. Si out_fd renvoie a un socket ou un tube qui ne gere pas la copie, les appelants doivent s'assurer que les parties transferees du fichier auquel renvoie in_fd ne soient pas modifiees jusqu'a ce que le lecteur de l'autre cote de out_fd n'ait consomme les donnees transferees. L'appel splice(2) specifique a Linux gere le transfert de donnees entre des descripteurs de fichiers arbitraires, pourvu que l'un d'eux (ou les deux) soit un tube. VOIR AUSSI copy_file_range(2), mmap(2), open(2), socket(2), splice(2) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 21 decembre 2023 sendfile(2)