focal (2) splice.2.gz

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