Standards
Standards / Extensions |
C or C++ |
Dependencies |
XPG4.2
Single UNIX Specification, Version 3
z/OS® UNIX
|
both |
|
Format
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/mman.h>
int mprotect(void *addr, size_t len, int prot);
General description
The mprotect()
function changes the access protections on the mappings specified
by the
len up to the next multiple of the
page size as returned by sysconf(), to be that specified by
prot.
Legitimate values for
prot are the same
as those permitted for mprotect() and are defined in <sys/mman.h.>:
- PROT_READ
- page can be read
- PROT_WRITE
- page can be written
- PROT_EXEC
- page can be executed
- PROT_NONE
- page cannot be accessed
The range provided by the Map_address and Map_length
may span regular maps as well as __MAP_MEGA maps. Mprotect affects
__MAP_MEGA maps very differently than regular maps. The difference
is in the scope of the change. When a change is made to a __MAP_MEGA
map, the change affects all processes which are currently mapped to
the same file-offset range represented by the pages within the provided
range. For example, changing a file-offset range (storage pages)
that is currently in use with a protection of write to a protection
of read, makes the file-offset range read for all processes, not just
the current one. In other words, the changes are global. On the
other hand, changes to regular maps affect only the process that issues
mprotect.
When mprotect() fails for reasons other than EINVAL,
the protection on some of the pages in the range [addr,
addr + len) may have been
changed.
Returned value
If successful, mprotect()
returns 0.
If unsuccessful, mprotect() returns -1 and sets
errno to one of the following values:
- Error Code
- Description
- EACCES
- The prot argument specifies a protection
that violates the access permission the process has to the underlying
memory object.
- EAGAIN
- The prot argument specifies PROT_WRITE
over a MAP_PRIVATE mapping and there are insufficient memory resources
to reserve for locking the private page.
- EINVAL
- The addr argument is not a multiple
of the page size as returned by sysconf().
- ENOMEM
- Addresses in the range [addr, addr + len)
are invalid for the address space of a process, or specify one or
more pages