Provided by: manpages-fr-dev_3.32d0.2p4-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
       courante dans le fichier et la position courante 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 courante 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.

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.32 du projet man-pages Linux.  Une  description
       du  projet  et  des  instructions  pour  signaler  des  anomalies  peuvent être trouvées à
       l'adresse <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

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