Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

       splice - Copier des données vers/depuis un tube

SYNOPSIS

       #define _GNU_SOURCE         /* Consultez feature_test_macros(7) */
       #include <fcntl.h>

       ssize_t splice(int fd_in, loff_t *off_in, int fd_out,
                      loff_t *off_out, size_t len, unsigned int flags);

DESCRIPTION

       splice()  déplace  des  données  entre  deux descripteurs de fichier sans les copier entre
       l'espace d'adressage noyau et l'espace utilisateur. Jusqu'à len  octets  de  données  sont
       transférés  du  descripteur de fichier fd_in au descripteur de fichier fd_out, où l'un des
       descripteurs doit correspondre à un tube.

       Si fd_in correspond à un tube, alors off_in doit être NULL. Si fd_in ne correspond  pas  à
       un tube et off_in est NULL, alors les octets sont lus depuis fd_in à partir de la position
       actuelle dans le fichier et la position actuelle est mise à jour de façon  appropriée.  Si
       fd_in ne correspond pas à un tube et off_in n'est pas NULL, alors off_in doit pointer vers
       un tampon qui indique la position à partir  de  laquelle  les  données  seront  lues  dans
       fd_in ;  dans ce cas, la position actuelle dans fd_in n'est pas modifiée. Il en va de même
       pour fd_out et off_out.

       L'argument flags est constitué par un OU  binaire  entre  une  ou  plusieurs  des  valeurs
       suivantes :

       SPLICE_F_MOVE      Essayer  de  déplacer des pages au lieu de les copier. Ceci n'est qu'un
                          conseil au noyau : des pages peuvent quand  même  être  copiées  si  le
                          noyau ne peut pas déplacer les pages du tube, ou si les tampons du tube
                          ne correspondent pas à des pages entières. La  première  implémentation
                          de  cet  attribut comportait un bogue : ainsi, à partir de Linux 2.6.21
                          il ne fait rien (mais est toujours permis dans un appel  à  splice()) ;
                          dans le futur, une implémentation correcte pourra être restaurée.

       SPLICE_F_NONBLOCK  Ne  pas  bloquer  sur  les entrées-sorties. Cela rend les opérations de
                          splice sur le tube non bloquantes, mais  splice()  peut  tout  de  même
                          bloquer  car  les descripteurs de fichier sur lesquels il opère peuvent
                          bloquer (sauf s'ils ont l'attribut O_NONBLOCK).

       SPLICE_F_MORE      Des données supplémentaires seront copiées plus tard. C'est  un  indice
                          utile lorsque fd_out correspond à une 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 RENVOYÉE

       En cas de réussite, splice() renvoie le nombre d'octets raccordés depuis ou vers le  tube.
       Une  valeur  de retour de 0 signifie qu'il n'y avait pas de données à transférer, et qu'il
       serait insensé de bloquer, parce qu'il n'y a pas d'écrivain connecté  à  l'autre  bout  du
       tube correspondant à fd_in.

       En  cas  d'erreur,  splice()  renvoie -1 et errno est positionné pour indiquer la cause de
       l'erreur.

ERREURS

       EBADF  Au moins un des descripteurs de fichier n'est pas valide, ou n'a  pas  le  mode  de
              lecture ou d'écriture approprié.

       EINVAL Le système de fichiers cible ne gère pas le splice ; le fichier cible est ouvert en
              mode ajout ; aucun des descripteurs de fichiers ne correspond à un tube ;  ou  bien
              une  position  a  été  indiquée  pour un périphérique sur lequel le déplacement est
              impossible.

       ENOMEM Plus de mémoire disponible.

       ESPIPE off_in  ou  off_out  est  différent  de  NULL,  mais  le  descripteur  de   fichier
              correspondant pointe vers un tube.

VERSIONS

       L'appel  système  splice()  est  apparu  dans  Linux 2.6.17,  la  glibc  le gère depuis la
       version 2.5.

CONFORMITÉ

       Cet appel système est spécifique à Linux.

NOTES

       Les trois appels système  splice(),  vmsplice(2)  et  tee(2)  fournissent  aux  programmes
       utilisateur  le contrôle complet d'un tampon arbitraire du noyau, implémenté côté noyau en
       utilisant le même type de tampons que pour les tubes.  Ces  appels  système  assurent  les
       tâches suivantes :

       splice()    déplace   des  données  depuis  le  tampon  vers  un  descripteur  de  fichier
                   arbitraire, ou vice versa, ou bien depuis un tampon vers un autre.

       tee(2)      « copie » les données d'un tampon vers un autre.

       vmsplice(2) « copie » des données de l'espace utilisateur vers le tampon.

       Bien qu'il soit question de copie, les vraies copies sont en  général  évitées.  Le  noyau
       implémente  en  effet le tampon d'un tube comme un ensemble de pointeurs vers des pages de
       mémoire noyau pouvant être référencées plusieurs fois. Le noyau crée  des  « copies »  des
       pages  dans  un tampon en créant de nouveaux pointeurs (pour le tampon de sortie) pointant
       vers les pages, et en incrémentant les compteurs  de  références  des  pages :  seuls  les
       pointeurs sont copiés, et pas les pages du tampon.

EXEMPLE

       Consultez tee(2).

VOIR AUSSI

       sendfile(2), tee(2), vmsplice(2)

COLOPHON

       Cette  page  fait partie de la publication 3.65 du projet man-pages Linux. Une description
       du projet et des  instructions  pour  signaler  des  anomalies  peuvent  être  trouvées  à
       l'adresse http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis    2010,    cette   traduction   est   maintenue   à   l'aide   de   l'outil   po4a
       <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du  projet
       perkamon <http://perkamon.alioth.debian.org/>.

       Julien Cristau et l'équipe francophone de traduction de Debian (2006-2009).

       Veuillez     signaler     toute     erreur     de     traduction     en     écrivant     à
       <debian-l10n-french@lists.debian.org>  ou  par  un  rapport  de  bogue   sur   le   paquet
       manpages-fr.

       Vous  pouvez  toujours  avoir  accès  à la version anglaise de ce document en utilisant la
       commande « man -L C <section> <page_de_man> ».