1MMAP(2)                    Linux Programmer's Manual                   MMAP(2)
2
3
4

NAME

6       mmap, munmap - map or unmap files or devices into memory
7

SYNOPSIS

9       #include <sys/mman.h>
10
11       void *mmap(void *addr, size_t length, int prot, int flags,
12                  int fd, off_t offset);
13       int munmap(void *addr, size_t length);
14
15       See NOTES for information on feature test macro requirements.
16

DESCRIPTION

18       mmap()  creates a new mapping in the virtual address space of the call‐
19       ing process.  The starting address for the new mapping is specified  in
20       addr.   The  length argument specifies the length of the mapping (which
21       must be greater than 0).
22
23       If addr is NULL, then the kernel chooses the (page-aligned) address  at
24       which to create the mapping; this is the most portable method of creat‐
25       ing a new mapping.  If addr is not NULL, then the kernel takes it as  a
26       hint about where to place the mapping; on Linux, the kernel will pick a
27       nearby page boundary (but always above or equal to the value  specified
28       by /proc/sys/vm/mmap_min_addr) and attempt to create the mapping there.
29       If another mapping already exists there, the kernel picks a new address
30       that may or may not depend on the hint.  The address of the new mapping
31       is returned as the result of the call.
32
33       The contents of a file mapping (as opposed to an anonymous mapping; see
34       MAP_ANONYMOUS  below),  are  initialized using length bytes starting at
35       offset offset in the file (or other object) referred to by the file de‐
36       scriptor fd.  offset must be a multiple of the page size as returned by
37       sysconf(_SC_PAGE_SIZE).
38
39       After the mmap() call has returned, the file  descriptor,  fd,  can  be
40       closed immediately without invalidating the mapping.
41
42       The  prot  argument describes the desired memory protection of the map‐
43       ping (and must not conflict with the open mode of the file).  It is ei‐
44       ther PROT_NONE or the bitwise OR of one or more of the following flags:
45
46       PROT_EXEC  Pages may be executed.
47
48       PROT_READ  Pages may be read.
49
50       PROT_WRITE Pages may be written.
51
52       PROT_NONE  Pages may not be accessed.
53
54   The flags argument
55       The  flags argument determines whether updates to the mapping are visi‐
56       ble to other processes mapping the same region, and whether updates are
57       carried through to the underlying file.  This behavior is determined by
58       including exactly one of the following values in flags:
59
60       MAP_SHARED
61              Share this mapping.  Updates to the mapping are visible to other
62              processes  mapping  the  same  region, and (in the case of file-
63              backed mappings) are carried through  to  the  underlying  file.
64              (To  precisely  control  when updates are carried through to the
65              underlying file requires the use of msync(2).)
66
67       MAP_SHARED_VALIDATE (since Linux 4.15)
68              This flag provides the same behavior as MAP_SHARED  except  that
69              MAP_SHARED mappings ignore unknown flags in flags.  By contrast,
70              when creating a mapping using  MAP_SHARED_VALIDATE,  the  kernel
71              verifies  all  passed flags are known and fails the mapping with
72              the error EOPNOTSUPP for unknown flags.  This  mapping  type  is
73              also  required  to  be  able  to  use  some mapping flags (e.g.,
74              MAP_SYNC).
75
76       MAP_PRIVATE
77              Create a private copy-on-write mapping.  Updates to the  mapping
78              are  not  visible  to other processes mapping the same file, and
79              are not carried through to the underlying file.  It is  unspeci‐
80              fied  whether changes made to the file after the mmap() call are
81              visible in the mapped region.
82
83       Both MAP_SHARED and  MAP_PRIVATE  are  described  in  POSIX.1-2001  and
84       POSIX.1-2008.  MAP_SHARED_VALIDATE is a Linux extension.
85
86       In addition, zero or more of the following values can be ORed in flags:
87
88       MAP_32BIT (since Linux 2.4.20, 2.6)
89              Put  the  mapping  into the first 2 Gigabytes of the process ad‐
90              dress space.  This flag is supported only on x86-64, for  64-bit
91              programs.   It  was added to allow thread stacks to be allocated
92              somewhere in the first 2 GB of memory, so as to improve context-
93              switch  performance  on  some  early  64-bit processors.  Modern
94              x86-64 processors no longer have this  performance  problem,  so
95              use  of  this  flag  is  not  required  on  those  systems.  The
96              MAP_32BIT flag is ignored when MAP_FIXED is set.
97
98       MAP_ANON
99              Synonym for MAP_ANONYMOUS; provided for compatibility with other
100              implementations.
101
102       MAP_ANONYMOUS
103              The mapping is not backed by any file; its contents are initial‐
104              ized to zero.  The fd argument is ignored; however, some  imple‐
105              mentations require fd to be -1 if MAP_ANONYMOUS (or MAP_ANON) is
106              specified, and portable applications should  ensure  this.   The
107              offset  argument  should  be  zero.  The use of MAP_ANONYMOUS in
108              conjunction with MAP_SHARED is supported  on  Linux  only  since
109              kernel 2.4.
110
111       MAP_DENYWRITE
112              This  flag  is ignored.  (Long ago—Linux 2.0 and earlier—it sig‐
113              naled that attempts to write to the underlying file should  fail
114              with  ETXTBSY.   But  this was a source of denial-of-service at‐
115              tacks.)
116
117       MAP_EXECUTABLE
118              This flag is ignored.
119
120       MAP_FILE
121              Compatibility flag.  Ignored.
122
123       MAP_FIXED
124              Don't interpret addr as a hint: place  the  mapping  at  exactly
125              that address.  addr must be suitably aligned: for most architec‐
126              tures a multiple of the page size is sufficient;  however,  some
127              architectures may impose additional restrictions.  If the memory
128              region specified by addr and len overlaps pages of any  existing
129              mapping(s),  then the overlapped part of the existing mapping(s)
130              will be discarded.  If the specified  address  cannot  be  used,
131              mmap() will fail.
132
133              Software  that  aspires  to be portable should use the MAP_FIXED
134              flag with care, keeping in mind  that  the  exact  layout  of  a
135              process's memory mappings is allowed to change significantly be‐
136              tween kernel versions, C library versions, and operating  system
137              releases.  Carefully read the discussion of this flag in NOTES!
138
139       MAP_FIXED_NOREPLACE (since Linux 4.17)
140              This  flag  provides  behavior that is similar to MAP_FIXED with
141              respect  to  the  addr  enforcement,   but   differs   in   that
142              MAP_FIXED_NOREPLACE  never  clobbers a preexisting mapped range.
143              If the requested range would collide with an  existing  mapping,
144              then  this  call  fails  with  the  error EEXIST.  This flag can
145              therefore be used as a way to atomically (with respect to  other
146              threads)  attempt  to map an address range: one thread will suc‐
147              ceed; all others will report failure.
148
149              Note  that  older   kernels   which   do   not   recognize   the
150              MAP_FIXED_NOREPLACE flag will typically (upon detecting a colli‐
151              sion with a preexisting mapping) fall back to a  "non-MAP_FIXED"
152              type  of behavior: they will return an address that is different
153              from  the  requested  address.   Therefore,  backward-compatible
154              software should check the returned address against the requested
155              address.
156
157       MAP_GROWSDOWN
158              This flag is used for stacks.  It indicates to the  kernel  vir‐
159              tual  memory  system  that the mapping should extend downward in
160              memory.  The return address is one page lower  than  the  memory
161              area  that  is actually created in the process's virtual address
162              space.  Touching an address in the "guard" page below  the  map‐
163              ping  will cause the mapping to grow by a page.  This growth can
164              be repeated until the mapping grows to within a page of the high
165              end  of  the  next  lower  mapping,  at which point touching the
166              "guard" page will result in a SIGSEGV signal.
167
168       MAP_HUGETLB (since Linux 2.6.32)
169              Allocate the mapping using "huge pages."  See the  Linux  kernel
170              source   file  Documentation/admin-guide/mm/hugetlbpage.rst  for
171              further information, as well as NOTES, below.
172
173       MAP_HUGE_2MB, MAP_HUGE_1GB (since Linux 3.8)
174              Used in  conjunction  with  MAP_HUGETLB  to  select  alternative
175              hugetlb page sizes (respectively, 2 MB and 1 GB) on systems that
176              support multiple hugetlb page sizes.
177
178              More generally, the desired huge page size can be configured  by
179              encoding  the  base-2  logarithm of the desired page size in the
180              six bits at the offset MAP_HUGE_SHIFT.  (A value of zero in this
181              bit  field provides the default huge page size; the default huge
182              page size can be discovered via the Hugepagesize  field  exposed
183              by  /proc/meminfo.)   Thus,  the above two constants are defined
184              as:
185
186                  #define MAP_HUGE_2MB    (21 << MAP_HUGE_SHIFT)
187                  #define MAP_HUGE_1GB    (30 << MAP_HUGE_SHIFT)
188
189              The range of huge page sizes that are supported  by  the  system
190              can  be  discovered  by  listing the subdirectories in /sys/ker‐
191              nel/mm/hugepages.
192
193       MAP_LOCKED (since Linux 2.5.37)
194              Mark the mapped region to be locked in the same way as mlock(2).
195              This  implementation  will  try to populate (prefault) the whole
196              range but the mmap() call  doesn't  fail  with  ENOMEM  if  this
197              fails.   Therefore  major  faults might happen later on.  So the
198              semantic is not as strong as mlock(2).  One  should  use  mmap()
199              plus  mlock(2)  when  major  faults are not acceptable after the
200              initialization of the mapping.  The MAP_LOCKED flag  is  ignored
201              in older kernels.
202
203       MAP_NONBLOCK (since Linux 2.5.46)
204              This  flag  is meaningful only in conjunction with MAP_POPULATE.
205              Don't perform read-ahead: create page tables  entries  only  for
206              pages that are already present in RAM.  Since Linux 2.6.23, this
207              flag causes MAP_POPULATE to do nothing.  One day,  the  combina‐
208              tion of MAP_POPULATE and MAP_NONBLOCK may be reimplemented.
209
210       MAP_NORESERVE
211              Do  not reserve swap space for this mapping.  When swap space is
212              reserved, one has the guarantee that it is  possible  to  modify
213              the  mapping.   When  swap  space  is not reserved one might get
214              SIGSEGV upon a write if no physical memory  is  available.   See
215              also  the  discussion of the file /proc/sys/vm/overcommit_memory
216              in proc(5).  In kernels before 2.6, this flag  had  effect  only
217              for private writable mappings.
218
219       MAP_POPULATE (since Linux 2.5.46)
220              Populate  (prefault) page tables for a mapping.  For a file map‐
221              ping, this causes read-ahead on the file.  This will help to re‐
222              duce  blocking  on page faults later.  MAP_POPULATE is supported
223              for private mappings only since Linux 2.6.23.
224
225       MAP_STACK (since Linux 2.6.27)
226              Allocate the mapping at an address suitable  for  a  process  or
227              thread stack.
228
229              This  flag is currently a no-op on Linux.  However, by employing
230              this flag, applications can ensure that they  transparently  ob‐
231              tain support if the flag is implemented in the future.  Thus, it
232              is used in the glibc threading implementation to allow  for  the
233              fact  that some architectures may (later) require special treat‐
234              ment for stack allocations.  A further  reason  to  employ  this
235              flag  is  portability:  MAP_STACK  exists (and has an effect) on
236              some other systems (e.g., some of the BSDs).
237
238       MAP_SYNC (since Linux 4.15)
239              This flag is available only with the MAP_SHARED_VALIDATE mapping
240              type;  mappings  of  type  MAP_SHARED  will silently ignore this
241              flag.  This flag is supported only for files supporting DAX (di‐
242              rect mapping of persistent memory).  For other files, creating a
243              mapping with this flag results in an EOPNOTSUPP error.
244
245              Shared file mappings with this flag provide the  guarantee  that
246              while some memory is mapped writable in the address space of the
247              process, it will be visible in the same file at the same  offset
248              even  after  the  system crashes or is rebooted.  In conjunction
249              with the use of  appropriate  CPU  instructions,  this  provides
250              users  of such mappings with a more efficient way of making data
251              modifications persistent.
252
253       MAP_UNINITIALIZED (since Linux 2.6.33)
254              Don't clear anonymous pages.  This flag is intended  to  improve
255              performance  on  embedded devices.  This flag is honored only if
256              the kernel was configured with the  CONFIG_MMAP_ALLOW_UNINITIAL‐
257              IZED  option.  Because of the security implications, that option
258              is normally enabled only  on  embedded  devices  (i.e.,  devices
259              where one has complete control of the contents of user memory).
260
261       Of  the  above  flags,  only MAP_FIXED is specified in POSIX.1-2001 and
262       POSIX.1-2008.  However, most systems also support MAP_ANONYMOUS (or its
263       synonym MAP_ANON).
264
265   munmap()
266       The munmap() system call deletes the mappings for the specified address
267       range, and causes further references to addresses within the  range  to
268       generate  invalid  memory references.  The region is also automatically
269       unmapped when the process is terminated.  On the  other  hand,  closing
270       the file descriptor does not unmap the region.
271
272       The  address  addr must be a multiple of the page size (but length need
273       not be).  All pages containing a part of the indicated  range  are  un‐
274       mapped, and subsequent references to these pages will generate SIGSEGV.
275       It is not an error if the indicated range does not contain  any  mapped
276       pages.
277

RETURN VALUE

279       On success, mmap() returns a pointer to the mapped area.  On error, the
280       value MAP_FAILED (that is, (void *) -1) is returned, and errno  is  set
281       to indicate the cause of the error.
282
283       On  success,  munmap() returns 0.  On failure, it returns -1, and errno
284       is set to indicate the cause of the error (probably to EINVAL).
285

ERRORS

287       EACCES A file descriptor refers to a non-regular file.  Or a file  map‐
288              ping  was  requested,  but  fd  is  not  open  for  reading.  Or
289              MAP_SHARED was requested and PROT_WRITE is set, but  fd  is  not
290              open in read/write (O_RDWR) mode.  Or PROT_WRITE is set, but the
291              file is append-only.
292
293       EAGAIN The file has been locked, or too much  memory  has  been  locked
294              (see setrlimit(2)).
295
296       EBADF  fd  is  not  a  valid file descriptor (and MAP_ANONYMOUS was not
297              set).
298
299       EEXIST MAP_FIXED_NOREPLACE was specified in flags, and the  range  cov‐
300              ered by addr and length clashes with an existing mapping.
301
302       EINVAL We don't like addr, length, or offset (e.g., they are too large,
303              or not aligned on a page boundary).
304
305       EINVAL (since Linux 2.6.12) length was 0.
306
307       EINVAL flags   contained   none   of   MAP_PRIVATE,    MAP_SHARED    or
308              MAP_SHARED_VALIDATE.
309
310       ENFILE The system-wide limit on the total number of open files has been
311              reached.
312
313       ENODEV The underlying filesystem of the specified file does not support
314              memory mapping.
315
316       ENOMEM No memory is available.
317
318       ENOMEM The  process's  maximum  number  of mappings would have been ex‐
319              ceeded.  This error can also occur for munmap(), when  unmapping
320              a  region  in  the middle of an existing mapping, since this re‐
321              sults in two smaller mappings on either side of the region being
322              unmapped.
323
324       ENOMEM (since  Linux 4.7) The process's RLIMIT_DATA limit, described in
325              getrlimit(2), would have been exceeded.
326
327       EOVERFLOW
328              On 32-bit architecture together with the  large  file  extension
329              (i.e.,  using 64-bit off_t): the number of pages used for length
330              plus number of pages used for  offset  would  overflow  unsigned
331              long (32 bits).
332
333       EPERM  The prot argument asks for PROT_EXEC but the mapped area belongs
334              to a file on a filesystem that was mounted no-exec.
335
336       EPERM  The operation was prevented by a file seal; see fcntl(2).
337
338       ETXTBSY
339              MAP_DENYWRITE was set but the object specified by fd is open for
340              writing.
341
342       Use of a mapped region can result in these signals:
343
344       SIGSEGV
345              Attempted write into a region mapped as read-only.
346
347       SIGBUS Attempted  access  to  a page of the buffer that lies beyond the
348              end of the mapped file.  For an explanation of the treatment  of
349              the  bytes  in  the page that corresponds to the end of a mapped
350              file that is not a multiple of the page size, see NOTES.
351

ATTRIBUTES

353       For an  explanation  of  the  terms  used  in  this  section,  see  at‐
354       tributes(7).
355
356       ┌───────────────────┬───────────────┬─────────┐
357Interface          Attribute     Value   
358       ├───────────────────┼───────────────┼─────────┤
359mmap(), munmap()   │ Thread safety │ MT-Safe │
360       └───────────────────┴───────────────┴─────────┘

CONFORMING TO

362       POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD.
363
364       On POSIX systems on which mmap(), msync(2), and munmap() are available,
365       _POSIX_MAPPED_FILES is defined in <unistd.h> to a value greater than 0.
366       (See also sysconf(3).)
367

NOTES

369       Memory  mapped by mmap() is preserved across fork(2), with the same at‐
370       tributes.
371
372       A file is mapped in multiples of the page size.  For a file that is not
373       a multiple of the page size, the remaining bytes in the partial page at
374       the end of the mapping are zeroed when  mapped,  and  modifications  to
375       that  region  are  not written out to the file.  The effect of changing
376       the size of the underlying file of a mapping on the pages  that  corre‐
377       spond to added or removed regions of the file is unspecified.
378
379       On   some  hardware  architectures  (e.g.,  i386),  PROT_WRITE  implies
380       PROT_READ.  It is  architecture  dependent  whether  PROT_READ  implies
381       PROT_EXEC  or  not.   Portable  programs should always set PROT_EXEC if
382       they intend to execute code in the new mapping.
383
384       The portable way to create a mapping is to specify addr  as  0  (NULL),
385       and  omit  MAP_FIXED  from flags.  In this case, the system chooses the
386       address for the mapping; the address is chosen so as  not  to  conflict
387       with any existing mapping, and will not be 0.  If the MAP_FIXED flag is
388       specified, and addr is 0 (NULL), then the  mapped  address  will  be  0
389       (NULL).
390
391       Certain  flags  constants  are  defined  only  if suitable feature test
392       macros are defined (possibly by default):  _DEFAULT_SOURCE  with  glibc
393       2.19  or  later;  or _BSD_SOURCE or _SVID_SOURCE in glibc 2.19 and ear‐
394       lier.  (Employing _GNU_SOURCE also suffices, and requiring  that  macro
395       specifically  would  have  been more logical, since these flags are all
396       Linux-specific.)  The relevant flags are: MAP_32BIT, MAP_ANONYMOUS (and
397       the   synonym   MAP_ANON),   MAP_DENYWRITE,  MAP_EXECUTABLE,  MAP_FILE,
398       MAP_GROWSDOWN, MAP_HUGETLB,  MAP_LOCKED,  MAP_NONBLOCK,  MAP_NORESERVE,
399       MAP_POPULATE, and MAP_STACK.
400
401       An  application  can  determine  which pages of a mapping are currently
402       resident in the buffer/page cache using mincore(2).
403
404   Using MAP_FIXED safely
405       The only safe use for MAP_FIXED is where the address range specified by
406       addr  and  length was previously reserved using another mapping; other‐
407       wise, the use of MAP_FIXED is hazardous  because  it  forcibly  removes
408       preexisting  mappings,  making  it  easy for a multithreaded process to
409       corrupt its own address space.
410
411       For example, suppose that thread A looks  through  /proc/<pid>/maps  in
412       order  to  locate  an  unused  address  range  that  it  can  map using
413       MAP_FIXED, while thread B simultaneously acquires part or all  of  that
414       same    address    range.    When   thread   A   subsequently   employs
415       mmap(MAP_FIXED), it will effectively clobber the mapping that thread  B
416       created.   In  this  scenario,  thread  B need not create a mapping di‐
417       rectly; simply making a library call that, internally,  uses  dlopen(3)
418       to  load  some  other shared library, will suffice.  The dlopen(3) call
419       will map the library into the process's  address  space.   Furthermore,
420       almost  any  library  call may be implemented in a way that adds memory
421       mappings to the address space, either with this technique, or by simply
422       allocating  memory.   Examples  include brk(2), malloc(3), pthread_cre‐
423       ate(3), and the PAM libraries ⟨http://www.linux-pam.org⟩.
424
425       Since Linux 4.17, a multithreaded program can use  the  MAP_FIXED_NORE‐
426       PLACE  flag to avoid the hazard described above when attempting to cre‐
427       ate a mapping at a fixed address that has not been reserved by a preex‐
428       isting mapping.
429
430   Timestamps changes for file-backed mappings
431       For file-backed mappings, the st_atime field for the mapped file may be
432       updated at any time between the mmap() and the corresponding unmapping;
433       the  first  reference  to a mapped page will update the field if it has
434       not been already.
435
436       The st_ctime and st_mtime field for a file mapped with  PROT_WRITE  and
437       MAP_SHARED  will be updated after a write to the mapped region, and be‐
438       fore a subsequent msync(2) with the MS_SYNC or MS_ASYNC  flag,  if  one
439       occurs.
440
441   Huge page (Huge TLB) mappings
442       For mappings that employ huge pages, the requirements for the arguments
443       of mmap() and munmap() differ somewhat from the requirements  for  map‐
444       pings that use the native system page size.
445
446       For mmap(), offset must be a multiple of the underlying huge page size.
447       The system automatically aligns length to be a multiple of the underly‐
448       ing huge page size.
449
450       For  munmap(), addr, and length must both be a multiple of the underly‐
451       ing huge page size.
452
453   C library/kernel differences
454       This page describes the interface provided by the glibc mmap()  wrapper
455       function.   Originally, this function invoked a system call of the same
456       name.  Since kernel 2.4,  that  system  call  has  been  superseded  by
457       mmap2(2),  and  nowadays  the  glibc  mmap()  wrapper  function invokes
458       mmap2(2) with a suitably adjusted value for offset.
459

BUGS

461       On Linux, there are no guarantees  like  those  suggested  above  under
462       MAP_NORESERVE.   By  default,  any  process can be killed at any moment
463       when the system runs out of memory.
464
465       In kernels before 2.6.7, the MAP_POPULATE flag has effect only if  prot
466       is specified as PROT_NONE.
467
468       SUSv3  specifies  that  mmap() should fail if length is 0.  However, in
469       kernels before 2.6.12, mmap() succeeded in this case:  no  mapping  was
470       created  and the call returned addr.  Since kernel 2.6.12, mmap() fails
471       with the error EINVAL for this case.
472
473       POSIX specifies that the system shall always zero fill any partial page
474       at the end of the object and that system will never write any modifica‐
475       tion of the object beyond its end.  On Linux, when you  write  data  to
476       such  partial  page  after the end of the object, the data stays in the
477       page cache even after the file is closed and unmapped and  even  though
478       the  data  is never written to the file itself, subsequent mappings may
479       see the modified content.  In some cases, this could be fixed by  call‐
480       ing  msync(2)  before the unmap takes place; however, this doesn't work
481       on tmpfs(5) (for example, when using the POSIX shared memory  interface
482       documented in shm_overview(7)).
483

EXAMPLES

485       The  following  program  prints part of the file specified in its first
486       command-line argument to standard output.  The range  of  bytes  to  be
487       printed  is  specified  via  offset and length values in the second and
488       third command-line arguments.  The program creates a memory mapping  of
489       the required pages of the file and then uses write(2) to output the de‐
490       sired bytes.
491
492   Program source
493       #include <sys/mman.h>
494       #include <sys/stat.h>
495       #include <fcntl.h>
496       #include <stdio.h>
497       #include <stdlib.h>
498       #include <unistd.h>
499
500       #define handle_error(msg) \
501           do { perror(msg); exit(EXIT_FAILURE); } while (0)
502
503       int
504       main(int argc, char *argv[])
505       {
506           char *addr;
507           int fd;
508           struct stat sb;
509           off_t offset, pa_offset;
510           size_t length;
511           ssize_t s;
512
513           if (argc < 3 || argc > 4) {
514               fprintf(stderr, "%s file offset [length]\n", argv[0]);
515               exit(EXIT_FAILURE);
516           }
517
518           fd = open(argv[1], O_RDONLY);
519           if (fd == -1)
520               handle_error("open");
521
522           if (fstat(fd, &sb) == -1)           /* To obtain file size */
523               handle_error("fstat");
524
525           offset = atoi(argv[2]);
526           pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
527               /* offset for mmap() must be page aligned */
528
529           if (offset >= sb.st_size) {
530               fprintf(stderr, "offset is past end of file\n");
531               exit(EXIT_FAILURE);
532           }
533
534           if (argc == 4) {
535               length = atoi(argv[3]);
536               if (offset + length > sb.st_size)
537                   length = sb.st_size - offset;
538                       /* Can't display bytes past end of file */
539
540           } else {    /* No length arg ==> display to end of file */
541               length = sb.st_size - offset;
542           }
543
544           addr = mmap(NULL, length + offset - pa_offset, PROT_READ,
545                       MAP_PRIVATE, fd, pa_offset);
546           if (addr == MAP_FAILED)
547               handle_error("mmap");
548
549           s = write(STDOUT_FILENO, addr + offset - pa_offset, length);
550           if (s != length) {
551               if (s == -1)
552                   handle_error("write");
553
554               fprintf(stderr, "partial write");
555               exit(EXIT_FAILURE);
556           }
557
558           munmap(addr, length + offset - pa_offset);
559           close(fd);
560
561           exit(EXIT_SUCCESS);
562       }
563

SEE ALSO

565       ftruncate(2), getpagesize(2),  memfd_create(2),  mincore(2),  mlock(2),
566       mmap2(2),  mprotect(2), mremap(2), msync(2), remap_file_pages(2), setr‐
567       limit(2), shmat(2), userfaultfd(2), shm_open(3), shm_overview(7)
568
569       The descriptions of the following files in  proc(5):  /proc/[pid]/maps,
570       /proc/[pid]/map_files, and /proc/[pid]/smaps.
571
572       B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128–129 and 389–391.
573

COLOPHON

575       This  page  is  part of release 5.10 of the Linux man-pages project.  A
576       description of the project, information about reporting bugs,  and  the
577       latest     version     of     this    page,    can    be    found    at
578       https://www.kernel.org/doc/man-pages/.
579
580
581
582Linux                             2020-12-21                           MMAP(2)
Impressum