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