splice(2) System Calls Manual splice(2) NOM splice - Copier des donnees vers/depuis un tube BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #define _GNU_SOURCE /* See feature_test_macros(7) */ #define _FILE_OFFSET_BITS 64 #include ssize_t splice(int fd_in, off_t *_Nullable off_in, int fd_out, off_t *_Nullable off_out, size_t len, unsigned int flags); DESCRIPTION splice() deplace des donnees entre deux descripteurs de fichier sans les copier entre l'espace d'adressage noyau et l'espace utilisateur. Jusqu'a len octets de donnees sont transferes du descripteur de fichier fd_in au descripteur de fichier fd_out, ou l'un des descripteurs de fichier doit correspondre a un tube. Les semantiques suivantes s'appliquent a fd_in et off_in : - Si fd_in correspond a un tube, alors off_in doit etre NULL. - Si fd_in ne correspond pas a un tube et si off_in est NULL, alors les octets sont lus depuis in_fd a partir de la position actuelle dans le fichier et la position resultante est mise a jour de facon appropriee. - Si fd_in ne correspond pas a un tube et off_in n'est pas NULL, alors off_in doit pointer vers un tampon qui indique la position a partir de laquelle les donnees seront lues dans fd_in ; dans ce cas, la position dans fd_in n'est pas modifiee. Il en va de meme pour fd_out et off_out. L'argument flags est un masque de bits constitue par un OU binaire entre une ou plusieurs des valeurs suivantes : SPLICE_F_MOVE Essayer de deplacer des pages au lieu de les copier. Ceci n'est qu'une astuce pour le au noyau : des pages peuvent quand meme etre copiees si le noyau ne peut pas deplacer les pages du tube ou si les tampons du tube ne correspondent pas a des pages entieres. La premiere implementation de cet attribut comportait un bogue : ainsi, a partir de Linux 2.6.21 il ne fait rien (mais est toujours permis dans un appel a splice()) ; dans le futur, une implementation correcte pourra etre restauree. SPLICE_F_NONBLOCK Ne pas bloquer sur les entrees-sorties. Cela rend les operations de splice sur le tube non bloquantes, mais splice() peut tout de meme bloquer car les descripteurs de fichier sur lesquels il opere peuvent bloquer (sauf s'ils ont l'attribut O_NONBLOCK). SPLICE_F_MORE Des donnees supplementaires seront copiees plus tard. C'est une astuce utile lorsque fd_out correspond a un socket (voir aussi la description de MSG_MORE dans send(2) et la description de TCP_CORK dans tcp(7)). SPLICE_F_GIFT N'a pas d'effet pour splice() ; consultez vmsplice(2). VALEUR RENVOYEE S'il reussit, splice() renvoie le nombre d'octets transferes dans ou a partir du tube. Une valeur de retour de 0 signifie la fin de l'entree. Si fd_in correspond a un tube, alors cela signifie qu'il n'y avait pas de donnees a transferer et que cela n'aurait pas de sens de bloquer parce qu'il n'y a pas d'ecrivain connecte a l'extremite d'ecriture du tube. En cas d'erreur, splice() renvoie -1 et errno est positionne pour indiquer la cause de l'erreur. ERREURS EAGAIN SPLICE_F_NONBLOCK etait indique dans flags ou un des descripteurs de fichier a ete marque comme non bloquant (O_NONBLOCK), et l'operation pourrait bloquer. EBADF Au moins un des descripteurs de fichier n'est pas valable, ou n'a pas le mode de lecture ou d'ecriture approprie. EINVAL Le systeme de fichiers cible ne prend pas en charge l'operation splice(). EINVAL Le fichier cible est ouvert en mode ajout. EINVAL Aucun des descripteurs de fichier ne correspond a un tube. EINVAL Une position a ete donnee pour un peripherique non adressable (par exemple un tube). EINVAL fd_in ou fd_out font reference au meme tube. ENOMEM Plus assez de memoire. ESPIPE off_in ou off_out est different de NULL, mais le descripteur de fichier correspondant pointe vers un tube. STANDARDS Linux. HISTORIQUE Linux 2.6.17, glibc 2.5. Dans Linux 2.6.30 et precedents, precisement un des descripteurs de fichier fd_in ou fd_out etait requis d'etre un tube. Depuis Linux 2.6.31, les deux arguments peuvent correspondre a des tubes. NOTES Les trois appels systeme splice(), vmsplice(2) et tee(2) fournissent aux programmes utilisateur le controle complet d'un tampon arbitraire du noyau, implemente cote noyau en utilisant le meme type de tampons que pour les tubes. Ces appels systeme assurent les taches suivantes : splice() deplace des donnees depuis le tampon vers un descripteur de fichier arbitraire, ou vice versa, ou bien depuis un tampon vers un autre. tee(2) << copie >> les donnees d'un tampon vers un autre. vmsplice(2) << copie >> des donnees de l'espace utilisateur vers le tampon. Bien qu'il soit question de copie, les vraies copies sont en general evitees. Le noyau implemente en effet le tampon d'un tube comme un ensemble de pointeurs vers des pages de memoire noyau pouvant etre referencees plusieurs fois. Le noyau cree des << copies >> des pages dans un tampon en creant de nouveaux pointeurs (pour le tampon de sortie) pointant vers les pages, et en incrementant les compteurs de references des pages : seuls les pointeurs sont copies, et pas les pages du tampon. _FILE_OFFSET_BITS should be defined to be 64 in code that uses non-null off_in or off_out or that takes the address of splice, if the code is intended to be portable to traditional 32-bit x86 and ARM platforms where off_t's width defaults to 32 bits. EXEMPLES Consultez tee(2). VOIR AUSSI copy_file_range(2), sendfile(2), tee(2), vmsplice(2), pipe(7) 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-Pierre Giraud 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 31 octobre 2023 splice(2)