Provided by: manpages-fr-dev_4.23.1-1_all bug

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  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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⟩.