Loading

NOM

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

SYNOPSIS

       #define _GNU_SOURCE
       #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);

       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() ; 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 ; 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

       Voir tee(2).

VOIR AUSSI

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

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.23 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> ».