Provided by: manpages-fr-dev_4.19.0-7_all bug

NOM

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

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

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

       ssize_t splice(int fd_in, off64_t *_Nullable off_in,
                      int fd_out, off64_t *_Nullable 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 de fichier doit correspondre à un tube.

       Les sémantiques suivantes s'appliquent à fd_in et off_in :

       •  Si fd_in correspond à un tube, alors off_in doit être NULL.

       •  Si fd_in ne correspond pas à un tube et si off_in est NULL, alors les octets  sont  lus
          depuis in_fd à partir de la position actuelle dans le fichier et la position résultante
          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 dans fd_in n'est pas modifiée.

       Il en va de même pour fd_out et off_out.

       L'argument flags est un masque de bits 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'une astuce pour
              le 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  une  astuce  utile
              lorsque  fd_out  correspond à 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 RENVOYÉE

       S'il réussit, splice() renvoie le nombre d'octets transférés dans ou à partir du tube.

       Une valeur de retour de 0 signifie la fin de l'entrée. Si  fd_in  correspond  à  un  tube,
       alors  cela  signifie qu'il n'y avait pas de données à transférer et que cela n'aurait pas
       de sens de bloquer parce qu'il n'y a pas d'écrivain connecté à l'extrémité  d'écriture  du
       tube.

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

ERREURS

       EAGAIN SPLICE_F_NONBLOCK était indiqué dans flags ou un des descripteurs de fichier a  été
              marqué comme non-bloquant (O_NONBLOCK) et l'opération pourrait bloquer.

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

       EINVAL Le système de fichiers cible ne prend pas en charge l'opération splice().

       EINVAL Le fichier cible est ouvert en mode ajout.

       EINVAL Aucun des descripteurs de fichier ne correspond à un tube.

       EINVAL Une position a été donnée pour un  périphérique  non  adressable  (par  exemple  un
              tube).

       EINVAL fd_in ou fd_out font référence au même tube.

       ENOMEM Plus assez de mémoire.

       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  prise  en  charge  de  la
       bibliothèque a été ajoutée dans la glibc 2.5.

STANDARDS

       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.

       Dans Linux 2.6.30 et précédents, précisément un  des  descripteurs  de  fichier  fd_in  ou
       fd_out  était  requis  d'être  un  tube.  Depuis  Linux 2.6.31, les deux arguments peuvent
       correspondre à des tubes.

EXEMPLES

       Consultez tee(2).

VOIR AUSSI

       copy_file_range(2), sendfile(2), tee(2), vmsplice(2), pipe(7)

TRADUCTION

       La traduction française de cette  page  de  manuel  a  été  créée  par  Christophe  Blaess
       <https://www.blaess.fr/christophe/>,  Stéphan  Rafin  <stephan.rafin@laposte.net>, Thierry
       Vignaud <tvignaud@mandriva.com>, François Micaux, Alain  Portal  <aportal@univ-montp2.fr>,
       Jean-Philippe    Guérard   <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-
       luc.coulon@wanadoo.fr>,   Julien    Cristau    <jcristau@debian.org>,    Thomas    Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,  Denis
       Barbier  <barbier@debian.org>,  David  Prévot  <david@tilapin.org>  et  Jean-Pierre Giraud
       <jean-pierregiraud@neuf.fr>

       Cette traduction est une documentation libre ; veuillez vous reporter  à  la  GNU  General
       Public   License   version 3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  concernant  les
       conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un
       message à ⟨debian-l10n-french@lists.debian.org⟩.