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

# shmat(2)

map/unmap shared memory

## NAME

**shmat**, **shmdt** – map/unmap shared memory

## SYNOPSIS

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

*void* *\**\

**shmat**(*int shmid*, *const void \*shmaddr*, *int shmflg*);

*int*\

**shmdt**(*const void \*shmaddr*);

## DESCRIPTION

**shmat**() maps the shared memory segment associated with the shared memory identifier *shmid* into the address space of the calling process. The address at which the segment is mapped is determined by the *shmaddr* parameter. If it is equal to 0, the system will pick an address itself. Otherwise, an attempt is made to map the shared memory segment at the address *shmaddr* specifies. If SHM\_RND is set in *shmflg*, the system will round the address down to a multiple of SHMLBA bytes (SHMLBA is defined in ⟨*sys/shm.h*⟩ ). A shared memory segment can be mapped read-only by specifying the SHM\_RDONLY flag in *shmflg*. **shmdt**() unmaps the shared memory segment that is currently mapped at *shmaddr* from the calling process' address space. *shmaddr* must be a value returned by a prior **shmat**() call. A shared memory segment will remain existant until it is removed by a call to [shmctl(2)](/shmctl/2.md) with the IPC\_RMID command.

## RETURN VALUES

**shmat**() returns the address at which the shared memory segment has been mapped into the calling process' address space when successful,  **shmdt**() returns 0 on successful completion. Otherwise, a value of -1 is returned, and the global variable *errno* is set to indicate the error.

## ERRORS

The **shmat**() system call will fail if:

- \[EACCES\]

  The calling process has no permission to access this shared memory segment.

- \[EINVAL\]

  *shmid* is not a valid shared memory identifier. *shmaddr* specifies an illegal address.

- \[EMFILE\]

  The number of shared memory segments has reached the system-wide limit.

- \[ENOMEM\]

  There is not enough available data space for the calling process to map the shared memory segment.

The **shmdt**() system call will fail if:

- \[EINVAL\]

  *shmaddr* is not the start address of a mapped shared memory segment.

## LEGACY SYNOPSIS

**#include \<sys/types.h\>** **#include \<sys/ipc.h\>** **#include \<sys/shm.h\>**

The include files ⟨sys/types.h⟩ and ⟨sys/ipc.h⟩ are necessary for both functions.

## SEE ALSO

[mmap(2)](/mmap/2.md), [shmctl(2)](/shmctl/2.md), [shmget(2)](/shmget/2.md), [compat(5)](/compat/5.md)
