Provided by: manpages-fr-dev_4.13-4_all bug

NOM

       mmap, munmap - Établir/supprimer une projection en mémoire (map/unmap) des fichiers ou des
       périphériques

SYNOPSIS

       #include <sys/mman.h>

       void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);
       int munmap(void *addr, size_t length);

       Consultez la section NOTES pour plus d'informations sur les exigences de la macro de  test
       de fonctionnalité.

DESCRIPTION

       mmap()  crée  une  nouvelle  projection  dans  l'espace  d'adressage  virtuel du processus
       appelant. L'adresse de démarrage de la nouvelle projection  est  indiquée  dans  addr.  Le
       paramètre length indique la longueur de la projection (qui doit être supérieure à 0).

       Si addr est NULL, le noyau choisit l'adresse (alignée sur une page) à laquelle démarrer la
       projection ; c'est la méthode la plus portable pour créer une nouvelle projection. Si addr
       n'est  pas  NULL,  le  noyau  le considère comme une indication sur l'endroit où placer la
       projection ; sous Linux, elle sera placée à une frontière de page  proche  (mais  toujours
       supérieure  ou  égale  à  la  valeur indiquée par /proc/sys/vm/mmap_min_addr) et tente d'y
       créer la projection. Si une projection y existe déjà, le noyau prend une nouvelle  adresse
       qui peut ou pas dépendre de l'indication. L'adresse de la nouvelle projection est renvoyée
       comme résultat de l'appel.

       Le contenu d'une projection de fichier (par opposition à  une  projection  anonyme ;  voir
       ci-dessous MAP_ANONYMOUS) est initialisé avec length octets à partir de la position offset
       dans le fichier (ou autre objet) correspondant au descripteur de fichier fd.  offset  doit
       être un multiple de la taille de la page renvoyée par sysconf(_SC_PAGE_SIZE).

       Après  le  retour  de  l'appel  mmap(),  le  descripteur  de  fichier  fd  peut être fermé
       immédiatement sans invalider la projection.

       L'argument prot indique la protection que l'on désire pour cette zone  de  mémoire  et  ne
       doit  pas  entrer  en  conflit  avec  le  mode  d'ouverture  du fichier. Il s'agit soit de
       PROT_NONE (le contenu de la mémoire est inaccessible)  soit  d'un  OU  binaire  entre  les
       constantes suivantes :

       PROT_EXEC  Il est possible d'exécuter les pages.

       PROT_READ  Il est possible de lire les pages.

       PROT_WRITE Il est possible d'écrire les pages.

       PROT_NONE  Il n'est pas possible d'accéder aux pages.

   Le paramètre des attributs
       Le  paramètre  flags  détermine si les modifications de la projection sont visibles depuis
       les autres processus projetant la même région et si les modifications sont  appliquées  au
       fichier  sous-jacent. Ce comportement est déterminé en incluant exactement une des valeurs
       suivantes dans flags :

       MAP_SHARED
              Partager la projection. Les modifications de la projection sont visibles  dans  les
              autres   processus  qui  projettent  la  même  région  et  (en  cas  de  projection
              file-backed)  elles  sont  appliquées  au  fichier  sous-jacent   (pour   contrôler
              précisément  le  moment  des  mises à jour du fichier sous-jacent, il faut utiliser
              msync(2)).

       MAP_SHARED_VALIDATE (depuis Linux 4.15)
              Cet attribut apporte le même comportement que MAP_SHARED sauf que  les  projections
              MAP_SHARED  ignorent  les  attributs  inconnus dans flags. Au contraire, lors de la
              création d'une projection en utilisant MAP_SHARED_VALIDATE, le  noyau  vérifie  que
              tous  les  attributs  passés  sont  connus  et  il  fait échouer la projection avec
              l'erreur EOPNOTSUPP pour les attributs inconnus. Ce type de  projection  est  aussi
              nécessaire pour pouvoir utiliser certains attributs de projection (comme MAP_SYNC).

       MAP_PRIVATE
              Créer  une  projection  privée,  utilisant  la  méthode  de copie à l'écriture. Les
              modifications de la projection ne sont pas visibles  depuis  les  autres  processus
              projetant  le  même  fichier, et ne modifient pas le fichier lui-même. Il n'est pas
              précisé si les changements effectués dans le fichier après  l'appel  mmap()  seront
              visibles dans la région projetée.

       MAP_SHARED    et   MAP_PRIVATE   sont   décrits   dans   POSIX.1-2001   et   POSIX.1-2008.
       MAP_SHARED_VALIDATE est une extension Linux.

       De plus, zéro ou plus des valeurs suivantes peuvent être incluses dans flags (avec  un  OU
       binaire) :

       MAP_32BIT (depuis Linux 2.4.20, 2.6)
              Placer  la  projection dans les deux premiers gigaoctets de l'espace d'adressage du
              processus. Cet attribut n'est pris en charge que sous x86-64, pour  les  programmes
              64 bits.  Il  a  été  ajouté  pour  permettre à la pile d'un fil d'exécution d'être
              allouée dans  les  deux  premiers  gigaoctets  de  mémoire,  afin  d'améliorer  les
              performances  des changements de contexte sur les premiers processeurs 64 bits. Les
              processeurs  x86-64  modernes  n'ont  plus  ces  problèmes  de  performance,   donc
              l'utilisation  de  cet  attribut  n'est pas nécessaire sur ces systèmes. L'attribut
              MAP_32BIT est ignoré quand MAP_FIXED est positionné.

       MAP_ANON
              Synonyme  de  MAP_ANONYMOUS ;  fourni  pour   une   compatibilité   avec   d'autres
              implémentations.

       MAP_ANONYMOUS
              La  projection n'est prise en charge par aucun fichier ; son contenu est initialisé
              à 0. L'argument fd est ignoré ; cependant, certaines implémentations demandent  que
              fd  soit  -1  si  MAP_ANONYMOUS  (ou  MAP_ANON)  est  utilisé,  et les applications
              portables  doivent  donc  s'en  assurer.  L'argument   offset   devrait   être   0.
              L'utilisation  de  MAP_ANONYMOUS avec MAP_SHARED n'est implémentée que depuis Linux
              2.4.

       MAP_DENYWRITE
              Cet attribut est ignoré (autrefois — Linux 2.0  et  antérieur —  il  signalait  une
              tentative  d'écriture  dans  le  fichier  sous-jacent et qui échouait avec l'erreur
              ETXTBUSY. Mais cela permettait des attaques par déni de service).

       MAP_EXECUTABLE
              Cet attribut est ignoré.

       MAP_FILE
              Attribut pour compatibilité. Ignoré.

       MAP_FIXED
              Ne pas considérer addr comme une indication : n'utiliser  que  l'adresse  indiquée.
              addr  doit  être  correctement  alignée :  pour  la  plupart  des architectures, un
              multiple de la taille de page suffit, toutefois  certaines  architectures  imposent
              des  limitations  supplémentaires.  Si  la  zone  mémoire  indiquée par addr et len
              recouvre  des  pages  d'une  projection  existante,  la  partie  recouverte  de  la
              projection  existante  sera  ignorée.  Si l'adresse indiquée ne peut être utilisée,
              mmap() échouera.

              Les logiciels qui aspirent à la portabilité devraient utiliser l'attribut MAP_FIXED
              prudemment,  en gardant à l'esprit que l'aspect exact des projections de mémoire du
              processus est autorisé à changer significativement entre les versions du noyau,  de
              la  glibc  et  du  système  d'exploitation.  Lisez  attentivement  le point sur cet
              attribut dans les NOTES !

       MAP_FIXED_NOREPLACE (depuis Linux 4.17)
              Cet  attribut  offre  un  comportement  identique  à  MAP_FIXED   par   rapport   à
              l'application  de  addr,  mais  il  s'en  distingue  en  ce que MAP_FIXED_NOREPLACE
              n’écrase jamais une plage projetée existante. Si la plage demandée entre en conflit
              avec  une projection existante, cet appel échoue avec l'erreur EEXIST. Cet attribut
              peut donc être utilisé comme une façon d'essayer de projeter une  plage  d'adresses
              de  manière  atomique  (vis-à-vis d'autres fils d'exécutions) : un thread réussira,
              tous les autres signaleront un échec.

              Remarquez  que  les  anciens   noyaux   qui   ne   reconnaissent   pas   l'attribut
              MAP_FIXED_NOREPLACE se rabattront généralement (en détectant une collision avec une
              projection  existante)  sur  un  type  de  comportement  « sans  MAP_FIXED » :  ils
              renverront    une   adresse   différente   de   celle   demandée.   Les   logiciels
              rétro-compatibles devront donc vérifier l'adresse renvoyée vis-à-vis  de  l'adresse
              demandée.

       MAP_GROWSDOWN
              Cet  attribut est utilisé pour les piles. Il indique au noyau le système de mémoire
              virtuelle vers lequel la projection devrait descendre dans  la  mémoire.  L'adresse
              renvoyée  est  une  page  inférieure  à  la  zone  de  mémoire  créée dans l'espace
              d'adressage virtuel du processus. La modification d'une adresse  dans  la  page  de
              « garde »  sous  la  projection  fera  agrandir  la  projection  d’une  page. Cette
              croissance peut se répéter jusqu'à ce que la taille de la projection dans  la  page
              atteigne  l’extrémité  haute  de  la  projection  plus  basse suivante, point où la
              modification de la page de « garde » donnera un signal SIGSEGV.

       MAP_HUGETLB (depuis Linux 2.6.32)
              Allouer la  projection  à  l'aide  de  « pages  immenses ».  Consultez  le  fichier
              Documentation/vm/hugetlbpage.txt   des   sources   du   noyau   Linux   pour   plus
              d'informations ainsi que les NOTES ci-dessous.

       MAP_HUGE_2MB, MAP_HUGE_1GB (depuis Linux 3.8)
              Utilisé avec MAP_HUGETLB pour  sélectionner  d'autres  tailles  de  pages  immenses
              (hugetlb)  (respectivement  2 Mo  et  1 Go)  sur  les systèmes qui gèrent plusieurs
              tailles de page hugetlb.

              Plus généralement, la taille de la page immense souhaitée peut être  configurée  en
              encodant  le logarithme de base 2 de la taille de la page désirée dans les six bits
              situés sur MAP_HUGE_SHIFT (une valeur de zéro dans  ce  champ  de  bit  fournit  la
              taille  de  page  immense  par  défaut ; vous pouvez connaître celle-ci à l'aide du
              champ Hugepagesize qui apparaît dans /proc/meminfo).  Ainsi,  les  deux  constantes
              ci-dessus sont définies comme suit :

                  #define MAP_HUGE_2MB    (21 << MAP_HUGE_SHIFT)
                  #define MAP_HUGE_1GB    (30 << MAP_HUGE_SHIFT)

              Vous  pouvez  connaître  l'intervalle  de  tailles des pages immenses gérées par le
              système en listant les sous-répertoires de /sys/kernel/mm/hugepages.

       MAP_LOCKED (depuis Linux 2.5.37)
              Marquer la région projetée pour qu'elle soit verrouillée de  la  même  manière  que
              mlock(2).  Cette  implémentation essaiera de remplir (prefault) toute la plage mais
              l'appel mmap() n’échouera pas avec ENOMEM  si  cela  échoue.  Des  erreurs  énormes
              pourraient  donc  se  produire  ultérieurement.  La sémantique n'est donc pas aussi
              robuste que mlock(2). Vous devriez utiliser mmap() et mlock(2) si d'énormes erreurs
              ne  sont  pas  acceptables  après  l'initialisation  de  la  projection. L'attribut
              MAP_LOCKED est ignoré sur les anciens noyaux.

       MAP_NONBLOCK (depuis Linux 2.5.46)
              Cet attribut n'a de sens qu'en conjonction avec MAP_POPULATE. Ne pas  effectuer  de
              lecture  anticipée :  créer  seulement les entrées de tables de page pour les pages
              déjà présentes en RAM. Depuis Linux 2.6.23, cet attribut fait que MAP_POPULATE  n'a
              aucun  effet.  Un  jour  la combinaison de MAP_POPULATE et MAP_NONBLOCK pourra être
              implémentée de nouveau.

       MAP_NORESERVE
              Ne pas réserver d'espace de swap pour les pages  de  cette  projection.  Une  telle
              réservation   garantit   que   l'on  puisse  modifier  les  zones  soumises  à  une
              copie-en-écriture. Sans réservation, on peut recevoir un signal SIGSEGV durant  une
              écriture,  s'il  n'y a plus de place disponible. Consultez également la description
              du fichier /proc/sys/vm/overcommit_memory dans la page  proc(5).  Dans  les  noyaux
              antérieurs  au 2.6,  cet  attribut n'avait d'effet que pour les projections privées
              modifiables.

       MAP_POPULATE (depuis Linux 2.5.46)
              Remplir (prefault) les tables de pages pour une projection. Pour une projection  de
              fichier,  cela provoque une lecture anticipée du fichier. Les accès ultérieurs à la
              projection ne seront pas bloqués par des erreurs de pages. MAP_POPULATE n'est  géré
              pour les projections privées que depuis Linux 2.6.23.

       MAP_STACK (depuis Linux 2.6.27)
              Allouer  la  projection à une adresse qui convient à la pile d'un processus ou d'un
              thread.

              Cet attribut n'est pas opérationnel pour l'instant sur Linux. Mais son  utilisation
              permet  aux  applications de s'assurer qu'elles le gèreront de manière transparente
              s'il est implémenté dans le futur. Ainsi, il est utilisé dans  l'implémentation  de
              threading  de  la  glibc pour accepter le fait que certaines architectures pourront
              (plus tard) nécessiter un traitement spécial pour  allouer  des  piles.  Une  autre
              raison  d'utiliser cet attribut est la portabilité : MAP_STACK existe et a un effet
              sur d'autres systèmes (comme certains BSD).

       MAP_SYNC (depuis Linux 4.15)
              Cet attribut n'est possible qu'avec le type de projection MAP_SHARED_VALIDATE ; les
              projections  de  type  MAP_SHARED ignoreront silencieusement cet attribut. Il n'est
              pris en charge que pour des fichiers gérant le DAX (projection directe  de  mémoire
              persistante).  Pour  les  autres  fichiers,  créer une projection avec cet attribut
              provoquera une erreur EOPNOTSUPP.

              Les projections de fichier partagé ayant cet attribut fournissent une garantie  que
              tant  que  la mémoire est projetée avec accès en écriture dans l'espace d'adressage
              du processus, elle sera visible dans le même fichier et au même endroit même  après
              un  plantage  ou un redémarrage du système. Couplé à l'utilisation des instructions
              adéquates du processeur, cela offre aux  utilisateurs  de  telles  projections  une
              manière plus efficace de rendre des modifications de données persistantes.

       MAP_UNINITIALIZED (depuis Linux 2.6.33)
              Ne pas effacer pas les pages anonymes. Cet attribut n'a pour l'instant un effet que
              si le noyau a été configuré avec l'option CONFIG_MMAP_ALLOW_UNINITIALIZED. À  cause
              des implications sur la sécurité, cette option n'est normalement active que sur des
              périphériques embarqués (c'est-à-dire avec des périphériques avec lesquels  il  est
              possible d'avoir un contrôle total de la mémoire utilisateur).

       Parmi   les  attributs  ci-dessus,  seul  MAP_FIXED  est  spécifié  dans  POSIX.1-2001  et
       POSIX.1-2008. Cependant, la plupart  des  systèmes  gèrent  aussi  MAP_ANONYMOUS  (ou  son
       synonyme MAP_ANON).

   munmap()
       L'appel  système  munmap()  détruit  la  projection  dans  la zone de mémoire spécifiée et
       s'arrange pour que toute référence ultérieure à cette zone mémoire  déclenche  une  erreur
       d'adressage.  La  projection  est  aussi  automatiquement détruite lorsque le processus se
       termine. À  l'inverse,  la  fermeture  du  descripteur  de  fichier  ne  supprime  pas  la
       projection.

       L'adresse  addr  doit  être  un  multiple  de  la  taille  de  la  page (mais ce n'est pas
       obligatoire pour length). Toutes les pages contenant une partie  de  l'intervalle  indiqué
       sont  libérées,  et tout accès ultérieur déclenchera SIGSEGV. Aucune erreur n'est détectée
       si l'intervalle indiqué ne contient pas de page projetée.

VALEUR RENVOYÉE

       En cas de succès, mmap() renvoie un pointeur sur la zone  projetée.  En  cas  d'échec,  la
       valeur  MAP_FAILED  (c'est-à-dire  (void *) -1)  est renvoyée et errno est positionné pour
       indiquer la cause de l'erreur.

       S'il réussit, munmap() renvoie 0. En cas d'échec, -1 est renvoyé et errno  est  positionné
       pour indiquer la cause de l'erreur (probablement EINVAL).

ERREURS

       EACCES Le  descripteur  ne correspond pas à un fichier normal ou une demande de projection
              de fichier a été demandée mais fd n'est pas ouvert en lecture, ou  une  demande  de
              projection  partagée  MAP_SHARED  avec protection PROT_WRITE a été demandée mais fd
              n'est pas ouvert en lecture et écriture (O_RDWR), ou encore PROT_WRITE est  demandé
              mais le fichier est ouvert en ajout seulement.

       EAGAIN Le  fichier  est  verrouillé  ou  trop  de  pages  ont  été verrouillées en mémoire
              (consultez setrlimit(2)).

       EBADF  fd n'est pas un descripteur  de  fichier  valable  (et  MAP_ANONYMOUS  n'était  pas
              précisé).

       EEXIST MAP_FIXED_NOREPLACE  était  indiqué  dans  flags  et  la plage couverte par addr et
              length est en conflit avec une projection existante.

       EINVAL addr ou length ou offset sont non valables (par exemple : zone trop grande, ou  non
              alignée sur une frontière de page).

       EINVAL (depuis Linux 2.6.12) length est nul.

       EINVAL flags ne contenait ni MAP_PRIVATE, ni MAP_SHARED, ni MAP_SHARED_VALIDATE.

       ENFILE La  limite  du  nombre  total  de  fichiers  ouverts  pour  le système entier a été
              atteinte.

       ENODEV Le système de fichiers sous‐jacent ne gère pas la projection en mémoire.

       ENOMEM Aucune mémoire disponible.

       ENOMEM Le nombre maximal de projections du processus serait  dépassé.  Cette  erreur  peut
              aussi  se  produire  pour  munmap()  lors  de la suppression d'une projection d'une
              région au milieu d'une projection existante, puisque  cela  provoque  deux  régions
              plus petites de chaque côté de la région à supprimer.

       ENOMEM (Depuis  Linux  4.7) La limite RLIMIT_DATA du processus, décrite dans getrlimit(2),
              serait dépassée.

       EOVERFLOW
              Sur architecture 32 bits avec l'extension de  fichiers  très  grands  (c'est-à-dire
              utilisant  un off_t sur 64 bits) : le nombre de pages utilisées pour length plus le
              nombre de pages utilisées pour offset dépasserait unsigned long (32 bits).

       EPERM  L'argument prot a demandé PROT_EXEC mais la zone appartient à  un  fichier  sur  un
              système de fichiers monté sans permission d'exécution.

       EPERM  La lecture a été interrompue par un signal ; consultez fnctl(2).

       ETXTBSY
              MAP_DENYWRITE a été réclamé mais fd est ouvert en écriture.

       L'accès à une zone de projection peut déclencher les signaux suivants :

       SIGSEGV
              Tentative d'écriture dans une zone en lecture seule.

       SIGBUS Tentative  d'accès  à une page du tampon au-delà de la fin du fichier projeté. Pour
              une explication du traitement des octets dans la page correspondant  à  la  fin  du
              fichier projeté n'étant pas un multiple de la taille de la page, voir les NOTES.

ATTRIBUTS

       Pour une explication des termes utilisés dans cette section, consulter attributes(7).

       ┌───────────────────┬──────────────────────┬─────────┐
       │InterfaceAttributValeur  │
       ├───────────────────┼──────────────────────┼─────────┤
       │mmap(), munmap()   │ Sécurité des threads │ MT-Safe │
       └───────────────────┴──────────────────────┴─────────┘

CONFORMITÉ

       POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD.

       Sur  les  systèmes  POSIX  sur  lesquels  mmap(),  msync(2)  et munmap() sont disponibles,
       _POSIX_MAPPED_FILES est définie dans <unistd.h> comme étant  une  valeur  supérieure  à  0
       (consultez aussi sysconf(3)).

NOTES

       La  mémoire  obtenue  par  mmap  est  préservée  au  travers  d'un fork(2), avec les mêmes
       attributs.

       Un fichier est projeté en multiples de de la taille de la page. Pour un  fichier  dont  la
       longueur  n'est  pas  un multiple de la taille de page, la mémoire restante est remplie de
       zéros lors de la projection, et les écritures dans cette zone n'affectent pas le  fichier.
       Les  effets  de  la  modification  de  la  taille  du  fichier  sous‐jacent  sur les pages
       correspondant aux zones ajoutées ou supprimées ne sont pas précisés.

       Sur  certaines  architectures  matérielles  (par  exemple,  i386),   PROT_WRITE   implique
       PROT_READ.  Cela  dépend  de  l'architecture  si  PROT_READ implique PROT_EXEC ou non. Les
       programmes portables doivent toujours indiquer PROT_EXEC s'ils veulent  exécuter  du  code
       dans la projection.

       La manière portable de créer une projection est de spécifier addr à 0 (NULL), et d'omettre
       MAP_FIXED dans flags. Dans ce  cas,  le  système  choisit  l'adresse  de  la  projection ;
       l'adresse  est choisie de manière à ne pas entrer en conflit avec une projection existante
       et de ne pas être nulle. Si l'attribut MAP_FIXED est indiqué et si  addr  vaut  0  (NULL),
       l'adresse projetée sera zéro (NULL).

       Certaines  constantes  de  flags  sont  définies  seulement  si  des  macros  de  test  de
       fonctionnalités adaptées sont définies (potentiellement par défaut) : _DEFAULT_SOURCE avec
       la  glibc  2.19  ou  supérieure, ou bien _BSD_SOURCE ou _SVID_SOURCE dans la glibc 2.19 et
       antérieure (la définition de _GNU_SOURCE suffit également, et son usage  aurait  été  plus
       logique,  puisque  ces  attributs  sont  tous spécifiques à Linux). Les attributs adéquats
       sont : MAP_32BIT, MAP_ANONYMOUS (et son synonyme MAP_ANON), MAP_DENYWRITE, MAP_EXECUTABLE,
       MAP_FILE,    MAP_GROWSDOWN,    MAP_HUGETLB,   MAP_LOCKED,   MAP_NONBLOCK,   MAP_NORESERVE,
       MAP_POPULATE, et MAP_STACK.

       Une application peut déterminer les pages d'une projection se trouvant dans  le  tampon/le
       cache de page en utilisant mincore(2).

   Utilisation sûre de MAP_FIXED
       La  seule utilisation sûre de MAP_FIXED est quand la plage d'adresses indiquée par addr et
       length a été  préalablement  réservée  en  utilisant  une  autre  projection ;  sans  quoi
       l'utilisation  de  MAP_FIXED  est hasardeuse car elle supprime brutalement des projections
       préexistantes, ce qui facilite la corruption par un processus multithread  de  son  propre
       espace d'adressage.

       Par  exemple,  supposons qu'un thread A cherche dans /proc/<pid>/maps une plage d'adresses
       inutilisée où il peut se projeter en utilisant MAP_FIXED, tandis qu'un thread  B  acquiert
       en  même  temps tout ou partie de cette même plage d'adresses. Quand le thread A utilisera
       ensuite mmap(MAP_FIXED), il va de fait écraser la projection créée par le thread  B.  Dans
       ce  scénario,  le  thread  B  ne  doit  pas  créer de projection directement ; un appel de
       bibliothèque qui, en  interne,  utilise  dlopen(3)  pour  charger  d'autres  bibliothèques
       partagées,  est  suffisant.  L'appel  dlopen(3)  projettera  la bibliothèque dans l'espace
       d'adressage du processus. De plus, presque tous les appels de bibliothèques  peuvent  être
       implémentés d'une manière qui ajoute des projections de mémoire aux espaces d'adressage, à
       l'aide de cette technique ou en allouant simplement de la  mémoire.  Parmi  les  exemples,
       figurent    brk(2),    malloc(3),    pthread_create(3)    et    les    bibliothèques   PAM
       ⟨http://www.linux-pam.org⟩.

       Depuis Linux 4.17, un programme multithreadé peut utiliser l'attribut  MAP_FIXED_NOREPLACE
       pour  éviter  le  risque  décrit  ci-dessus  quand on essaie de créer une projection à une
       adresse fixe non réservée par une projection préexistante.

   Modifications d'horodatage pour les projections prises en charge par un fichier
       Pour les projections prises en charge par un fichier, le champ st_atime  du  fichier  peut
       être  mis  à  jour  à  tout  moment  entre l'appel mmap() et le munmap() correspondant. Le
       premier accès dans la page projetée mettra le champ à jour si cela n'a pas été déjà fait.

       Les champs st_ctime et st_mtime pour un fichier  projeté  avec  PROT_WRITE  et  MAP_SHARED
       seront mis à jour après une écriture dans la région projetée, et avant l'éventuel msync(2)
       suivant avec l'attribut MS_SYNC ou MS_ASYNC.

   Projections de pages immenses (Huge TLB)
       Pour les projections qui utilisent des pages immenses,  les  exigences  des  attributs  de
       mmap()  et  de munmap() diffèrent quelque peu de celles pour des projections qui utilisent
       la taille native des pages du système.

       Pour mmap(), offset doit être un multiple de la taille de la page immense sous-jacente. Le
       système  aligne automatiquement length pour qu'il soit un multiple de la taille de la page
       immense sous-jacente.

       Pour munmap(), addr et length doivent être tous deux un multiple de la taille de  la  page
       immense sous-jacente.

   différences entre bibliothèque C et noyau
       Cette  page  décrit  l'interface fournie par la fonction mmap() de la glibc. Initialement,
       cette fonction appelait un appel système du même nom.  Depuis  le  noyau  2.4,  cet  appel
       système  a été remplacé par mmap2(2). De nos jours, la fonction mmap() de la glibc appelle
       mmap2(2) avec la bonne valeur pour offset.

BOGUES

       Sous Linux, il n'y a aucune  garantie  comme  celles  indiquées  plus  haut  à  propos  de
       MAP_NORESERVE. Par défaut, n'importe quel processus peut être tué à tout moment lorsque le
       système n'a plus de mémoire.

       Dans les noyaux antérieurs à 2.6.7, le drapeau MAP_POPULATE n'avait d'effet  que  si  prot
       était PROT_NONE.

       SUSv3  indique que mmap() devrait échouer si length est 0. Cependant, avec les versions de
       Linux antérieures à 2.6.12, mmap() réussissait dans ce  cas :  aucune  projection  n'était
       créée,  et  l'appel  renvoyait  addr.  Depuis  le noyau 2.6.12, mmap() échoue avec le code
       d'erreur EINVAL si length est nul.

       POSIX spécifie que  le  système  devrait  toujours  remplir  de  zéros  toutes  les  pages
       incomplètes  à  la  fin  de  l'objet  et que le système n'écrira jamais de modification de
       l'objet au-delà de sa fin. Sous Linux, lors de l'écriture de  données  vers  ce  genre  de
       pages  incomplètes après la fin de l'objet, les données restent dans le cache de page même
       après que le fichier soit fermé et déprojeté, et  même  si  les  données  ne  sont  jamais
       écrites  vers  le  fichier  lui-même, les projections suivantes pourraient voir le contenu
       modifié. Dans certains cas, cela pourrait être  corrigé  en  appelant  msync(2)  avant  la
       déprojection.  Cependant,  cela  ne  fonctionne pas sur tmpfs(5) (par exemple en utilisant
       l'interface de mémoire partagée POSIX documentée dans shm_overview(7)).

EXEMPLES

       Le programme suivant affiche la partie du fichier, précisé par le premier argument  de  la
       ligne  de commande, sur la sortie standard. Les octets qui seront affichés sont précisés à
       partir d'un offset (déplacement) et d'une longueur en deuxième et troisième paramètre.  Le
       code  fait  une  projection mémoire des pages nécessaires du fichier puis utilise write(2)
       pour afficher les octets voulus.

   Source du programme
       #include <sys/mman.h>
       #include <sys/stat.h>
       #include <fcntl.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

       #define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

       int
       main(int argc, char *argv[])
       {
           char *addr;
           int fd;
           struct stat sb;
           off_t offset, pa_offset;
           size_t length;
           ssize_t s;

           if (argc < 3 || argc > 4) {
               fprintf(stderr, "%s fichier offset [longueur]\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           fd = open(argv[1], O_RDONLY);
           if (fd == -1)
               handle_error("open");

           if (fstat(fd, &sb) == -1)           /* Pour obtenir la taille du fichier */
               handle_error("fstat");

           offset = atoi(argv[2]);
           pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
               /* la position de mmap() doit être alignée sur la page */

           if (offset >= sb.st_size) {
               fprintf(stderr, "L'offset dépasse la fin du fichier\n");
               exit(EXIT_FAILURE);
           }

           if (argc == 4) {
               length = atoi(argv[3]);
               if (offset + length > sb.st_size)
                   length = sb.st_size - offset;
                       /* Impossible d'afficher les octets en dehors du fichier */

           } else {    /* Pas de paramètre longueur
                          ==> affichage jusqu'à la fin du fichier */
               length = sb.st_size - offset;
           }

           addr = mmap(NULL, length + offset - pa_offset, PROT_READ,
                       MAP_PRIVATE, fd, pa_offset);
           if (addr == MAP_FAILED)
               handle_error("mmap");

           s = write(STDOUT_FILENO, addr + offset - pa_offset, length);
           if (s != length) {
               if (s == -1)
                   handle_error("write");

               fprintf(stderr, "écriture partielle");
               exit(EXIT_FAILURE);
           }

           munmap(addr, length + offset - pa_offset);
           close(fd);

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       ftruncate(2),   getpagesize(2),   memfd_create(2),   mincore(2),    mlock(2),    mmap2(2),
       mprotect(2),    mremap(2),    msync(2),   remap_file_pages(2),   setrlimit(2),   shmat(2),
       userfaultfd(2), shm_open(3), shm_overview(7)

       Dans proc(5), les descriptions des  fichiers  /proc/[pid]/maps,  /proc/[pid]/map_files  et
       /proc/[pid]/smaps.

       B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128–129 et 389–391.

COLOPHON

       Cette  page  fait partie de la publication 5.10 du projet man-pages 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/.

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 ⟨⟩.