Provided by: manpages-fr-dev_3.17.1-1_all bug

NOM

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

SYNOPSIS

       #define _GNU_SOURCE
       #include <fcntl.h>

       long 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 E/S. 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(2) ; voir 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,  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

       Voir tee(2).

VOIR AUSSI

       sendfile(2), tee(2), vmsplice(2), feature_test_macros(7)

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.17 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

       Cette page de manuel a été traduite et est maintenue par Julien Cristau
       <julien.cristau@ens-lyon.org>  et l’équipe francophone de traduction de
       Debian.

       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> ».