Man page - sendfile64(2)

Packages contains this manual

Available languages:

en fr pl ja ru ro

Manual

sendfile

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
VERSIONS
STANDARDS
HISTORIQUE
NOTES
VOIR AUSSI
TRADUCTION

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 efficace 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 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 actuelle dans le fichier in_fd ; autrement, la position actuelle de la tĂȘte de lecture est ajustĂ©e pour reflĂ©ter le nombre d’octets lus Ă  partir de in_fd .

Si offset est NULL, les donnĂ©es sont lues dans in_fd Ă  partir de la position 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. 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 Ă  un socket. Depuis Linux 2.6.33, ce peut ĂȘtre n’importe quel fichier. Si c’est un fichier adressable, 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 descripteur) et l’opĂ©ration devrait bloquer.

EBADF

Le fichier d’entrĂ©e n’est pas ouvert en lecture ou celui de sortie 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 adressable.

VERSIONS

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.

STANDARDS

Aucun

HISTORIQUE

Linux 2.2, glibc 2.1.

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 transparente ces diffĂ©rences entre noyaux.

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’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 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 auquel 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 Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.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.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.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 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 .