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