.\" -*- coding: UTF-8 -*- .\"This manpage is Copyright (C) 2015 Anna Schumaker .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of .\" this manual under the conditions for verbatim copying, provided that .\" the entire resulting derived work is distributed under the terms of .\" a permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume .\" no responsibility for errors or omissions, or for damages resulting .\" from the use of the information contained herein. The author(s) may .\" not have taken the same level of care in the production of this .\" manual, which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH COPY_FILE_RANGE 2 "10 octobre 2019" Linux "Manuel du programmeur Linux" .SH NOM copy_file_range \- Copier une plage de données d'un fichier vers un autre .SH SYNOPSIS .nf \fB#define _GNU_SOURCE\fP \fB#include \fP .PP \fBssize_t copy_file_range(int \fP\fIfd_in\fP\fB, loff_t *\fP\fIoff_in\fP\fB,\fP \fB int \fP\fIfd_out\fP\fB, loff_t *\fP\fIoff_out\fP\fB,\fP \fB size_t \fP\fIlen\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP .fi .SH DESCRIPTION L'appel système \fBcopy_file_range\fP() 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'à \fIlen\fP octets de données sont transférés du descripteur de fichier \fIfd_in\fP au descripteur de fichier \fIfd_out\fP, écrasant toute donnée se trouvant dans la plage du fichier cible sollicité. .PP La sémantique suivante s'applique à \fIoff_in\fP et des déclarations identiques s'appliquent à \fIoff_out\fP\ : .IP * 3 Si \fIoff_in\fP est NULL, les octets sont lus dans \fIfd_in\fP à partir de la position du fichier, laquelle est ajustée par le nombre d'octets copiés. .IP * Si \fIoff_in\fP n'est pas NULL, \fIoff_in\fP doit pointer vers un tampon qui indique le point de départ à partir duquel les octets de \fIfd_in\fP seront lus. La position du fichier de \fIfd_in\fP n'est pas modifiée mais \fIoff_in\fP est ajusté correctement. .PP \fIfd_in\fP et \fIfd_out\fP 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. .PP L'argument \fIflags\fP n'est fourni que pour des extensions futures et doit être positionné à \fB0\fP pour l'instant. .SH "VALEUR RENVOYÉE" En cas de succès, \fBcopy_file_range\fP() 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 \fIfd_in\fP est à la fin du fichier ou au\-delà, aucun octet n'est copié et \fBcopy_file_range\fP() renvoie zéro. .PP En cas d'erreur, \fBcopy_file_range\fP() renvoie \fB\-1\fP et \fIerrno\fP est configuré pour indiquer l'erreur. .SH ERREURS .TP \fBEBADF\fP Un ou plusieurs descripteurs de fichier ne sont pas valables. .TP \fBEBADF\fP \fIfd_in\fP n'est pas ouvert en lecture ou \fIfd_out\fP n'est pas ouvert en écriture. .TP \fBEBADF\fP L'attribut \fBO_APPEND\fP est configuré pour une description d'un fichier ouvert (voir \fBopen\fP(2)) auquel renvoie le descripteur de fichier \fIfd_out\fP. .TP \fBEFBIG\fP Tentative d'écriture sur une position dépassant la position maximale du fichier gérée par le noyau. .TP \fBEFBIG\fP 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. .TP \fBEFBIG\fP 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 \fISIGXFSZ\fP. .TP \fBEINVAL\fP Le paramètre \fIflags\fP ne vaut pas \fB0\fP. .TP \fBEINVAL\fP \fIfd_in\fP et \fIfd_out\fP se rapportent au même fichier et les plages de la source et de la cible se chevauchent. .TP \fBEINVAL\fP \fIfd_in\fP ou \fIfd_out\fP n'est pas un fichier normal. .TP \fBEIO\fP Une erreur E/S de bas niveau s'est produite lors de la copie. .TP \fBEISDIR\fP \fIfd_in\fP ou \fIfd_out\fP se rapporte à un répertoire. .TP \fBENOMEM\fP Plus assez de mémoire. .TP \fBENOSPC\fP Il n'y a pas assez d'espace sur le système de fichiers cible pour terminer la copie. .TP \fBEOVERFLOW\fP La plage source ou de destination demandée est trop grande pour être représentée dans les types de données indiqués. .TP \fBEPERM\fP \fIfd_out\fP se rapporte à un fichier immuable. .TP \fBETXTBSY\fP \fIfd_in\fP ou \fIfd_out\fP se rapporte à un fichier d'échange actif. .TP \fBEXDEV\fP Les fichiers auxquels se rapportent \fIfile_in\fP et \fIfile_out\fP ne sont pas sur le même système de fichiers monté (avant Linux 5.3). .SH VERSIONS .\" https://sourceware.org/git/?p=glibc.git;a=commit;f=posix/unistd.h;h=bad7a0c81f501fbbcc79af9eaa4b8254441c4a1f L'appel système \fBcopy_file_range\fP() est apparu pour la première fois dans Linux\ 4.5, mais la glibc 2.27 offre une émulation dans l'espace utilisateur s'il n'est pas disponible. .PP L'implémentation du noyau a été profondément retravaillée dans la version 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. .PP Une première prise en charge des copies entre plusieurs systèmes de fichiers a été introduite dans Linux 5.3. Les anciens noyaux renverront \-EXDEV si on tente des copies entre systèmes de fichiers. .SH CONFORMITÉ L'appel système \fBcopy_file_range\fP() est une extension GNU et un non standard de Linux. .SH NOTES Si \fIfile_in\fP est un fichier éparpillé, il se peut que \fBcopy_file_range\fP() agrandisse les trous existant dans la plage demandée. Les utilisateurs peuvent tirer avantage de profiter d'un appel à \fBcopy_file_range\fP() dans une boucle et en utilisant les opérations \fBSEEK_DATA\fP et \fBSEEK_HOLE\fP de \fBlseek\fP(2) pour chercher des emplacements de segments de données. .PP \fBcopy_file_range\fP() 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). .SH EXEMPLE .EX #define _GNU_SOURCE #include #include #include #include #include #include /* Sur les versions de la glibc antérieures à 2.27, il faut appeler copy_file_range() en utilisant syscall(2) */ static loff_t copy_file_range(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags) { return syscall(__NR_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags); } int main(int argc, char **argv) { int fd_in, fd_out; struct stat stat; loff_t len, ret; if (argc != 3) { fprintf(stderr, "Utilisation\ : %s \en", 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); } .EE .SH "VOIR AUSSI" \fBlseek\fP(2), \fBsendfile\fP(2), \fBsplice\fP(2) .SH COLOPHON Cette page fait partie de la publication\ 5.04 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Jean-Philippe MENGUAL . Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE 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 à .MT debian-l10n-french@lists.debian.org .ME .