---
name: "mprotect"
section: "2"
platform: "macos"
package: "xnu"
version: "12377.121.6"
release: "macOS 26.5"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/mprotect"
---

# mprotect(2)

control the protection of pages

## NAME

**mprotect** – control the protection of pages

## SYNOPSIS

**#include \<sys/mman.h\>**

*int*\

**mprotect**(*void \*addr*, *size\_t len*, *int prot*);

## DESCRIPTION

The **mprotect**() system call changes the specified pages to have protection *prot*. Not all implementations will guarantee protection on a page basis but Mac OS X's current implementation does.

When a program violates the protections of a page, it gets a SIGBUS or SIGSEGV signal.

Currently *prot* can be one or more of the following:

- PROT\_NONE

  No permissions at all.

- PROT\_READ

  The pages can be read.

- PROT\_WRITE

  The pages can be written.

- PROT\_EXEC

  The pages can be executed.

## RETURN VALUES

Upon successful completion, a value of 0 is returned. Otherwise, a value of -1 is returned and *errno* is set to indicate the error.

## ERRORS

**mprotect**() will fail if:

- \[EACCES\]

  The requested protection conflicts with the access permissions of the process on the specified address range.

- \[EINVAL\]

  *addr* is not a multiple of the page size (i.e. *addr* is not page-aligned).

- \[ENOMEM\]

  The specified address range is outside of the address range of the process or includes an unmapped page.

- \[ENOTSUP\]

  The combination of accesses requested in *prot* is not supported.

## LEGACY SYNOPSIS

**#include \<sys/types.h\>** **#include \<sys/mman.h\>**

The include file ⟨sys/types.h⟩ is necessary.

*int*\
 **mprotect**(*caddr\_t addr*, *size\_t len*, *int prot*);

The type of *addr* has changed.

## SEE ALSO

[madvise(2)](/madvise/2.md), [mincore(2)](/mincore/2.md), [msync(2)](/msync/2.md), [munmap(2)](/munmap/2.md), [compat(5)](/compat/5.md)

## HISTORY

The **mprotect**() function first appeared in 4.4BSD.
