splice - Copier des données vers/depuis un tube
Bibliothèque C standard (
libc,
-lc)
#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);
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).
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.
- 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.
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.
Cet appel système est spécifique à Linux.
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.
Consultez
tee(2).
copy_file_range(2),
sendfile(2),
tee(2),
vmsplice(2),
pipe(7)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Jean-Pierre Giraud <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 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 à
[email protected]