dwww Home | Manual pages | Find package

sendfile(2)                   System Calls Manual                  sendfile(2)

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

BIBLIOTHÈQUE
       Bibliothèque C standard (libc, -lc)

SYNOPSIS
       #include <sys/sendfile.h>

       ssize_t sendfile(int out_fd, int in_fd, off_t *_Nullable offset,
                        size_t count);

DESCRIPTION
       sendfile()  copie des données entre deux descripteurs de fichier. Comme
       la copie est assurée à l'intérieur du noyau, sendfile() est plus  effi-
       cace  que  la  combinaison  read(2)/write(2) qui exige le transfert des
       données entre l'espace noyau et l'espace utilisateur.

       in_fd doit être un descripteur de fichier ouvert en lecture  et  out_fd
       un descripteur ouvert 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 va-
       riable 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 actuelle dans le fichier in_fd ; autrement, la position ac-
       tuelle  de la tête de lecture est ajustée pour refléter le nombre d'oc-
       tets lus à partir de in_fd.

       Si offset est NULL, les données sont lues dans in_fd à partir de la po-
       sition  actuelle  de  la  tête  de lecture et celle-ci sera ajustée par
       l'appel.

       L'argument count est le nombre d'octets à copier entre les descripteurs
       de fichiers.

       L'argument  in_fd  doit correspondre à un fichier prenant en charge les
       opérations de type mmap(2) et ne peut donc pas être un socket.

       Avant Linux 2.6.33, out_fd doit correspondre à un  socket.  Depuis  Li-
       nux 2.6.33,  ce  peut  être n'importe quel fichier. Si c'est un fichier
       normal, sendfile() modifie la position de tête  de  lecture  en  consé-
       quence.

VALEUR RENVOYÉE
       Si  le  transfert  a  réussi, le nombre d'octets écrits dans out_fd est
       renvoyé. Remarquez qu'un appel à sendfile() réussi  peut  écrire  moins
       d'octets que demandé, l'appelant doit se préparer à réitérer l'appel en
       cas de données non envoyées. Voir aussi les NOTES.

       En cas d'erreur, la valeur de retour est -1 et errno est  définie  pour
       préciser l'erreur.

ERREURS
       EAGAIN L'écriture  est  non  bloquante (attribut O_NONBLOCK du descrip-
              teur) et l'opération devrait bloquer.

       EBADF  Le fichier d'entrée n'est pas ouvert en lecture ou celui de sor-
              tie en écriture.

       EFAULT Un pointeur se trouve en dehors de l'espace d'adressage.

       EINVAL Le  descripteur n'est pas valable ou est verrouillé, ou une opé-
              ration de type mmap(2) n'est pas disponible sur in_fd,  ou  bien
              count est négatif.

       EINVAL out_fd a un drapeau O_APPEND positionné. Cela n'est actuellement
              pas géré par sendfile().

       EIO    Erreur pendant la lecture depuis in_fd.

       ENOMEM Mémoire insuffisante pour lire depuis in_fd.

       EOVERFLOW
              count est trop grand,  l'opération  ferait  dépasser  la  taille
              maximale du fichier d'entrée ou de sortie.

       ESPIPE offset  n'est pas NULL mais le fichier d'entrée n'est pas adres-
              sable.

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

STANDARDS
       Pas spécifié dans POSIX.1-2001, ni dans d'autres normes.

       D'autres  systèmes  UNIX  implémentent  sendfile() avec d'autres séman-
       tiques, et d'autres prototypes. Il ne faut pas l'utiliser dans un  pro-
       gramme portable.

NOTES
       sendfile()  transfèrera un maximum de 0x7ffff000 (2 147 479 552) octets
       et renvoie le nombre d'octets transférés (cela est vrai tant  pour  des
       systèmes 32 bits que 64 bits).

       Si  vous  voulez utiliser sendfile() pour envoyer un fichier au travers
       d'un socket TCP, tout en le précédant de données d'en-tête, voyez l'op-
       tion TCP_CORK de tcp(7) pour minimiser le nombre de paquets, et optimi-
       ser les performances.

       Sous Linux 2.4 et précédents, out_fd pouvait aussi  correspondre  à  un
       fichier  ordinaire,  cette possibilité a disparu dans la série 2.6.3 du
       noyau Linux, puis rétablie dans Linux 2.6.33.

       L'appel système original de Linux sendfile() ne permettait pas de gérer
       les  positions  dans  les  gros  fichiers.  En conséquence, Linux 2.4 a
       ajouté sendfile64(), avec un type élargi pour le paramètre  offset.  La
       fonction  sendfile() de la glibc qui l'encapsule gère de manière trans-
       parente ces différences entre noyaux.

       Les applications peuvent se rabattre sur read(2) et write(2) au cas  où
       sendfile() échoue avec EINVAL ou ENOSYS.

       Si  out_fd renvoie à un socket ou un tube qui ne gère pas la copie, les
       appelants doivent s'assurer que les parties transférées du fichier  au-
       quel renvoie in_fd ne soient pas modifiées jusqu'à ce que le lecteur de
       l'autre côté de out_fd n'ait consommé les données transférées.

       L'appel splice(2) spécifique à Linux gère le transfert de données 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 française de cette page de manuel a été créée par  Chris-
       tophe  Blaess  <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste-
       phan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, Fran-
       çois  Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Gué-
       rard <fevrier@tigreraye.org>, Jean-Luc  Coulon  (f5ibh)  <jean-luc.cou-
       lon@wanadoo.fr>,  Julien  Cristau <jcristau@debian.org>, Thomas Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François  <nicolas.francois@centra-
       liens.net>,  Florentin  Duneau <fduneau@gmail.com>, Simon Paillard <si-
       mon.paillard@resel.enst-bretagne.fr>,   Denis   Barbier    <barbier@de-
       bian.org>,  David  Prévot  <david@tilapin.org> et Jean-Philippe MENGUAL
       <jpmengual@debian.org>

       Cette traduction est une documentation libre ; veuillez vous reporter à
       la        GNU        General       Public       License       version 3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ concernant  les  conditions
       de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si  vous découvrez un bogue dans la traduction de cette page de manuel,
       veuillez envoyer un message à ⟨debian-l10n-french@lists.debian.org⟩.

Pages du manuel de Linux 6.03   4 décembre 2022                    sendfile(2)

Generated by dwww version 1.15 on Sat Jun 29 01:34:11 CEST 2024.