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 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() ; 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.
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.44 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> ».