Man page - copy_file_range(2)

Packages contains this manual

Available languages:

en fr pl ru

Manual

copy_file_range

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
VERSIONS
STANDARDS
HISTORIQUE
NOTES
BOGUES
EXEMPLES
VOIR AUSSI
TRADUCTION

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 à debian-l10n-french@lists.debian.org .