zion - sendfile
Nom
sendfile - Transfert de données entre descripteurs de fichiers.
Résumé
#include <sys/sendfile.h> size_t sendfile(int out_fd , int in_fd , off_t * offset , size_t count );
Description
Cet appel-système copie des données entre un descripteur de fichier et un autre. L'un ou l'autre de ces descripteurs peuvent être une socket (voir plus bas). Le descripteur in_fd doit être ouvert en lecture, et out_fd en écriture. Le pointeur offset doit correspondre à une variable contenant la position dans le fichier d'entrée à partir de laquelle sendfile () commencera la lecture. Lorsque la routine se termine, la variable est remplie avec la position de l'octet immédiatement après le dernier octet lu. L'argument count est le nombre d'octets à copier entre les descripteurs de fichiers. Comme la copie est assurée à l'intérieur du noyau, sendfile () ne perd pas de temps à transférer des données entre l'espace noyau et l'espace utilisateur.
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 senbdfile() 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. Actuellement, le descripteur depuis lequel les données sont lues ne peut pas être une socket, il doit s'agir d'un fichier supportant les opérations de type mmap().
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
EBADF
Le fichier d'entrée n'est pas ouvert en lecture, ou celui de sortie en écriture. |
EINVAL
Le descripteur est invalide ou verrouillé. |
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. Les autres Unix implémentent sendfile() avec d'autres sémantiques, et d'autres prototypes. Il ne faut pas l'utiliser dans un programme portable.
Voir aussi
socket (2), open (2)
Traduction
Christophe Blaess, 1996-2003.
Poster un commentaire