splice()
déplace des données entre deux descripteurs de fichier sans les copier
entre l'espace d'adressage noyau et l'espace d'adressage utilisateur.
Il transfère jusqu'à
len
octets de données à partir du descripteur de fichier
fd_in
vers le descripteur de fichier
fd_out,
où l'un des deux descripteurs doit faire référence à un tube.
Si
fd_in
fait référence à un tube,
off_in
doit être NULL.
Si
fd_in
ne fait pas référence à un tube et si
off_in
est NULL, les octets sont lus dans
fd_in
à partir de la position courante de la tête de lecture sur le fichier,
celle-ci étant mise à jour de manière appropriée.
Si
fd_in
ne fait pas référence à un tube et si
off_in
n'est pas NULL,
off_in
doit pointer sur un tampon qui spécifie la position à partir de laquelle
seront lus les octets dans
fd_in ;
dans ce cas, la position courante de la tête de lecture de
fd_in
n'est pas modifiée.
Cela s'applique également à
fd_out
et
off_out.
L'argument
flags
est un masque de bits constitué par un OU binaire
entre zéro ou plusieurs des valeurs suivantes :
-
- SPLICE_F_MOVE
-
Essayer de déplacer les pages au lieu de les copier.
Ce n'est qu'un conseil du noyau :
les 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 font pas référence
à des pages complètes.
-
- SPLICE_F_NONBLOCK
-
Ne pas bloquer sur les E/S.
Cela rend les opérations de copie sur le tube non bloquantes, mais
splice()
peut tout de même bloquer car les descripteurs de fichier mis en jeu
peuvent bloquer (sauf s'ils ont l'attribut
O_NONBLOCK
défini).
-
- SPLICE_F_MORE
-
Des données supplémentaires seront copiées plus tard.
C'est une indication utile lorsque
fd_out
fait référence à une socket (voir aussi la description de
MSG_MORE
dans
send(2),
et la description de
TCP_CORK
dans
tcp(7))
-
- SPLICE_F_GIFT
-
Non utilisé pour
splice() ;
voir
vmsplice(2).