---
name: "shmget"
section: "2"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/shmget/2"
---

# shmget(2)

obtain a shared memory identifier

## NAME

**shmget** – obtain a shared memory identifier

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

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

*int*\

**shmget**(*key\_t key*, *size\_t size*, *int flag*);

## DESCRIPTION

Based on the values of *key* and *flag*, **shmget**() returns the identifier of a newly created or previously existing shared memory segment. The key is analogous to a filename: it provides a handle that names an IPC object. There are three ways to specify a key:

- IPC\_PRIVATE may be specified, in which case a new IPC object will be created.

- An integer constant may be specified. If no IPC object corresponding to *key* is specified and the IPC\_CREAT bit is set in *flag*, a new one will be created.

- The [ftok(3)](/ftok/3.md) may be used to generate a key from a pathname.

The mode of a newly created IPC object is determined by which are set by ORing these constants into the *flag* argument:

- 0400

  Read access for owner.

- 0200

  Write access for owner.

- 0040

  Read access for group.

- 0020

  Write access for group.

- 0004

  Read access for other.

- 0002

  Write access for other.

When creating a new shared memory segment, *size* indicates the desired size of the new segment in bytes. The size of the segment may be rounded up to a multiple convenient to the kernel (i.e., the page size).

## RETURN VALUES

Upon successful completion, **shmget**() returns the positive integer identifier of a shared memory segment. Otherwise, -1 is returned and *errno* set to indicate the error.

## ERRORS

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

- \[EINVAL\]

  Size specified is greater than the size of the previously existing segment. Size specified is less than the system imposed minimum, or greater than the system imposed maximum.

- \[ENOENT\]

  No shared memory segment was found matching *key*, and IPC\_CREAT was not specified.

- \[ENOSPC\]

  The kernel was unable to allocate enough memory to satisfy the request.

- \[EEXIST\]

  IPC\_CREAT and IPC\_EXCL were specified, and a shared memory segment corresponding to *key* already exists.

## SEE ALSO

[shmat(2)](/shmat/2.md), [shmctl(2)](/shmctl/2.md), [shmdt(2)](/shmdt/2.md), [ftok(3)](/ftok/3.md)
