---
name: "shmget_secure"
section: "2"
platform: "linux"
package: "libselinux-dev"
version: "2002031409-4"
release: "Debian 3.0 (Woody)"
platforms: ["linux"]
url: "https://new.carta.tech/shmget/2"
---

# shmget\_secure(2)

allocates a shared memory segment

Part of [shmget(2)](/shmget/2.md).

## NAME

shmget, shmget\_secure - allocates a shared memory segment

## SYNOPSIS

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

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

**#include \<linux/flask/flask\_types.h\> /\* for msgget\_secure \*/**

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

**int shmget\_secure(key\_t** *key***, int** *size***, int** *shmflg***, security\_id\_t** *sid);*

## DESCRIPTION

**shmget()** returns the identifier of the shared memory segment associated to the value of the argument *key*. A new shared memory segment, with size equal to the round up of *size* to a multiple of **PAGE\_SIZE**, is created if *key* has value **IPC\_PRIVATE** or *key* isn't **IPC\_PRIVATE**, no shared memory segment is associated to *key*, and **IPC\_CREAT** is asserted in *shmflg* (i.e. *shmflg***&IPC\_CREAT** isn't zero). The presence in

*shmflg* is composed of:

- **IPC\_CREAT**

  to create a new segment. If this flag is not used, then  **shmget()** will find the segment associated with *key*, check to see if  the user has permission to receive the *shmid* associated with the segment, and ensure the segment is not marked for destruction. If [**shmget\_secure**(2)](/shmget_secure/2.md) is used the *sid* argument must match the value of the existing semaphore set in addition to the access permissions being checked.

- **IPC\_EXCL**

  used with **IPC\_CREAT** to ensure failure if the segment exists.

- **mode\_flags (lowest 9 bits)**

  specifying the permissions granted to the owner, group, and world. Presently, the execute permissions are not used by the system.

If a new segment is created, the access permissions from *shmflg* are copied into the  *shm\_perm* member of the  *shmid\_ds* structure that defines the segment. The *shmid\_ds* structure:

```
struct shmid_ds {
	struct	ipc_perm shm_perm;	/* operation perms */
	int	shm_segsz;		/* size of segment (bytes) */
	time_t	shm_atime;		/* last attach time */
	time_t	shm_dtime;		/* last detach time */
	time_t	shm_ctime;		/* last change time */
	unsigned short	shm_cpid;	/* pid of creator */
	unsigned short	shm_lpid;	/* pid of last operator */
	short	shm_nattch;		/* no. of current attaches */
};
```

```
struct ipc_perm
{
  key_t  key;
  ushort uid;   /* owner euid and egid */
  ushort gid;
  ushort cuid;  /* creator euid and egid */
  ushort cgid;
  ushort mode;  /* lower 9 bits of shmflg */
  ushort seq;   /* sequence number */
};
```

Furthermore, while creating, the system call initializes the system shared memory segment data structure **shmid\_ds** as follows:

-

  **shm\_perm.cuid** and **shm\_perm.uid** are set to the effective user-ID of the calling process.

-

  **shm\_perm.cgid** and **shm\_perm.gid** are set to the effective group-ID of the calling process.

-

  The lowest order 9 bits of **shm\_perm.mode** are set to the lowest order 9 bit of *shmflg*.

-

  **shm\_segsz** is set to the value of *size.*

-

  **shm\_lpid**, **shm\_nattch**, **shm\_atime** and **shm\_dtime** are set to **0.**

-

  **shm\_ctime** is set to the current time.

If the shared memory segment already exists, the access permissions are verified, and a check is made to see if it is marked for destruction.

## SYSTEM CALLS

- **fork()**

  After a **fork()** the child inherits the attached shared memory segments.

- **exec()**

  After an **exec()** all attached shared memory segments are detached (not destroyed).

- **exit()**

  Upon **exit()** all attached shared memory segments are detached (not destroyed).

## RETURN VALUE

A valid segment identifier, *shmid*, is returned on success, -1 on error.

## ERRORS

On failure, **errno** is set to one of the following:

- **EINVAL**

  is returned if **SHMMIN** \> *size* or *size* \> **SHMMAX**, or *size* is greater than size of segment.

- **EEXIST**

  is returned if  **IPC\_CREAT \| IPC\_EXCL** was specified and the segment exists.

- **EIDRM**

  is returned if the segment is marked as destroyed, or was removed.

- **ENOSPC**

  is returned if all possible shared memory id's have been taken(**SHMMNI**) or if allocating a segment of the requested *size* would cause the system to exceed the system-wide limit on shared memory(**SHMALL**).

- **ENOENT**

  is returned if no segment exists for the given *key*, and **IPC\_CREAT** was not specified.

- **EACCES**

  is returned if the user does not have permission to access the  shared memory segment or the calling process lacks permission to create a shared memory segment with the specified *sid.*

- **ENOMEM**

  is returned if no memory could be allocated for segment overhead.

## NOTES

**IPC\_PRIVATE** isn't a flag field but a **key\_t** type. If this special value is used for *key*, the system call ignores everything but the lowest order 9 bits of *shmflg* and creates a new shared memory segment (on success).

The followings are limits on shared memory segment resources affecting a **shmget** call:

- **SHMALL**

  System wide maximum of shared memory pages: policy dependent.

- **SHMMAX**

  Maximum size in bytes for a shared memory segment: implementation dependent (currently 4M).

- **SHMMIN**

  Minimum size in bytes for a shared memory segment: implementation dependent (currently 1 byte, though **PAGE\_SIZE** is the effective minimum size).

- **SHMMNI**

  System wide maximum number of shared memory segments: implementation dependent (currently 4096).

The implementation has no specific limits for the per process maximum number of shared memory segments (**SHMSEG**).

## BUGS

Use of **IPC\_PRIVATE** doesn't inhibit to other processes the access to the allocated shared memory segment.

As for the files, there is currently no intrinsic way for a process to ensure exclusive access to a shared memory segment. Asserting both **IPC\_CREAT** and **IPC\_EXCL** in *shmflg* only ensures (on success) that a new shared memory segment will be created, it doesn't imply exclusive access to the segment.

## CONFORMING TO

SVr4, SVID.  SVr4 documents an additional error condition EEXIST. Neither SVr4 nor SVID documents an EIDRM condition.

## SEE ALSO

[**ftok**(3)](/ftok/3.md), [**ipc**(5)](/ipc/5.md), [**shmctl**(2)](/shmctl/2.md), [**shmat**(2)](/shmat/2.md), [**shmdt**(2)](/shmdt/2.md), [**shmsid**(2)](/shmsid/2.md).
