copy_file_range
Table des matières
Retour à l'index
NOM
copy_file_range - Copier une plage de données d'un fichier vers un autre
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64
#include <unistd.h>
ssize_t copy_file_range(int fd_in, off_t *_Nullable off_in,
int fd_out, off_t *_Nullable off_out,
size_t len, unsigned int flags);
DESCRIPTION
L'appel système copy_file_range() effectue une copie interne au noyau
entre deux descripteurs de fichier sans devoir en plus transférer des
données du noyau à l'espace utilisateur puis revenir au noyau. Jusqu'à
len octets de données sont transférés du descripteur de fichier fd_in
au descripteur de fichier fd_out, écrasant toute donnée se trouvant dans
la plage du fichier cible sollicité.
La sémantique suivante s'applique à off_in et des déclarations identiques
s'appliquent à off_out :
- -
-
Si off_in est NULL, les octets sont lus dans fd_in à partir de la
position du fichier, laquelle est ajustée par le nombre d'octets copiés.
- -
-
Si off_in n'est pas NULL, off_in doit pointer vers un tampon qui
indique le point de départ à partir duquel les octets de fd_in seront
lus. La position du fichier de fd_in n'est pas modifiée mais off_in
est ajusté correctement.
fd_in et fd_out peuvent se rapporter au même fichier. Dans ce cas, les
plages de la source et de la cible ne sont pas autorisées à se chevaucher.
L'argument flags est fourni pour de futures extensions et doit être
positionné actuellement sur 0.
VALEUR RENVOYÉE
En cas de succès, copy_file_range() renverra le nombre d'octets copiés
entre les fichiers. Il pourrait être inférieur à la taille demandée au
départ. Si la position du fichier de fd_in est à la fin du fichier ou
au-delà, aucun octet n'est copié et copy_file_range() renvoie zéro.
En cas d'erreur, copy_file_range() renvoie -1 et errno est
configuré pour indiquer l'erreur.
ERREURS
- EBADF
-
Un ou plusieurs descripteurs de fichier ne sont pas valables.
- EBADF
-
fd_in n'est pas ouvert en lecture ou fd_out n'est pas ouvert en
écriture.
- EBADF
-
L'attribut O_APPEND est configuré pour une description d'un fichier
ouvert (voir open(2)) auquel renvoie le descripteur de fichier fd_out.
- EFBIG
-
Tentative d'écriture sur une position dépassant la position maximale du
fichier gérée par le noyau.
- EFBIG
-
Tentative d'écriture d'une plage dépassant la taille maximale d'un fichier
permise. La taille maximale d'un fichier varie selon les implémentations de
système de fichiers et peut être différente de la position du fichier
maximale autorisée.
- EFBIG
-
Tentative d'écriture au-delà de la limite de ressource de la taille du
fichier du processus. Cela peut aussi avoir pour conséquence la réception,
par le processus, d'un signal SIGXFSZ.
- EINVAL
-
Le paramètre flags ne vaut pas 0.
- EINVAL
-
fd_in et fd_out se rapportent au même fichier et les plages de la
source et de la cible se chevauchent.
- EINVAL
-
fd_in ou fd_out n'est pas un fichier normal.
- EIO
-
Une erreur E/S de bas niveau s'est produite lors de la copie.
- EISDIR
-
fd_in ou fd_out se rapporte à un répertoire.
- ENOMEM
-
Plus assez de mémoire.
- ENOSPC
-
Il n'y a pas assez d'espace sur le système de fichiers cible pour terminer
la copie.
- EOPNOTSUPP (depuis Linux 5.19)
-
Le système de fichiers ne prend pas en charge cette opération.
- EOVERFLOW
-
La plage source ou de destination demandée est trop grande pour être
représentée dans les types de données indiqués.
- EPERM
-
fd_out se rapporte à un fichier immuable.
- ETXTBSY
-
fd_in ou fd_out se rapporte à un fichier d'échange actif.
- EXDEV (depuis Linux 5.3)
-
Les fichiers auxquels se rapportent fd_in et fd_out ne sont pas sur le
même système de fichiers.
- EXDEV (depuis Linux 5.19)
-
Les fichiers auxquels se rapportent fd_in et fd_out ne sont pas sur le
même système de fichiers et les systèmes de fichiers source et cible ne sont
pas du même type ou ne prennent pas en charge la copie entre systèmes de
fichiers.
VERSIONS
L'implémentation du noyau a été profondément retravaillée dans
Linux 5.3. Les zones de l'API qui n'étaient pas clairement définies ont été
clarifiées et les limites de l'API sont vérifiées beaucoup plus strictement
que sur les noyaux précédents. Les applications devraient cibler le
comportement et les exigences des noyaux 5.3.
Depuis Linux 5.19, les copies entre systèmes de fichiers peuvent se faire
quand les deux systèmes de fichiers sont du même type et si le système de
fichiers le prend en charge. Voir BOGUES pour le comportement avant la 5.19.
Les applications devraient cibler le comportement et les exigences de
Linux 5.3 qui ont aussi été rétroportés dans les noyaux stable plus récents.
STANDARDS
Linux, GNU.
HISTORIQUE
Linux 4.5, mais la glibc 2.27 offre une émulation dans l'espace utilisateur
s'il n'est pas disponible.
NOTES
Si fd_in est un fichier éparpillé, il se peut que copy_file_range()
agrandisse les trous existant dans la plage demandée. Les utilisateurs
peuvent bénéficier d'un appel à copy_file_range() dans une boucle et
utiliser les opérations SEEK_DATA et SEEK_HOLE de lseek(2) pour
chercher des emplacements de segments de données.
copy_file_range() donne aux systèmes de fichiers la possibilité
d'implémenter des techniques de « copie accélérée » telles que l'utilisation
de reflink (c'est-à-dire deux ou plusieurs i-nœuds partageant des pointeurs
avec les mêmes blocs de disque copy-on-write) ou server-side-copy (dans le
cas de NFS).
_FILE_OFFSET_BITS devrait être défini pour être 64 dans le code qui
utilise off_in ou off_out non NULL ou qui obtient l'adresse de
copy_file_range, si le code est destiné à être portable sur les
plateformes x86 32 bits et ARM traditionnelles où la taille par défaut de
off_t est de 32 bits.
BOGUES
De Linux 5.3 à Linux 5.18, les copies entre système de fichiers étaient
implémentées par le noyau si l'opération n'était pas gérée par les systèmes
de fichiers eux-mêmes. Cependant, sur certains systèmes de fichiers
virtuels, le code n'arrivait pas à faire la copie mais la présentait comme
réussie.
EXEMPLES
#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
int fd_in, fd_out;
off_t len, ret;
struct stat stat;
if (argc != 3) {
fprintf(stderr, "Utilisation : %s <source> <destination>\n", argv[0]);
exit(EXIT_FAILURE);
}
fd_in = open(argv[1], O_RDONLY);
if (fd_in == -1) {
perror("open (argv[1])");
exit(EXIT_FAILURE);
}
if (fstat(fd_in, &stat) == -1) {
perror("fstat");
exit(EXIT_FAILURE);
}
len = stat.st_size;
fd_out = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0644);
if (fd_out == -1) {
perror("open (argv[2])");
exit(EXIT_FAILURE);
}
do {
ret = copy_file_range(fd_in, NULL, fd_out, NULL, len, 0);
if (ret == -1) {
perror("copy_file_range");
exit(EXIT_FAILURE);
}
len -= ret;
} while (len > 0 && ret > 0);
close(fd_in);
close(fd_out);
exit(EXIT_SUCCESS);
}
VOIR AUSSI
lseek(2), sendfile(2), splice(2)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>
et
Jean-Philippe MENGUAL <jpmengual@debian.org>
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 à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- VERSIONS
-
- STANDARDS
-
- HISTORIQUE
-
- NOTES
-
- BOGUES
-
- EXEMPLES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:01 GMT, September 19, 2025