GNU/Linux |
CentOS 4.8 |
i386 |
![]() |
shmget(2) |
![]() |
shmget − allocates a shared memory segment
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
shmget() returns the identifier of the shared memory segment associated with the value of the argument key. A new shared memory segment, with size equal to the value of size rounded up to a multiple of PAGE_SIZE, is created if key has the value IPC_PRIVATE or key isn’t IPC_PRIVATE, no shared memory segment corresponding to key exists, and IPC_CREAT is asserted in shmflg (i.e. shmflg&IPC_CREAT isn’t zero).
The value shmflg is composed of:
SHM_HUGETLB |
used for allocating HUGETLB pages for shared memory. IPC_CREAT to create a new segment. If this flag is not used, then shmget() will find the segment associated with key and check to see if the user has permission to access the segment. | ||
IPC_EXCL |
used with IPC_CREAT to ensure failure if the segment already 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 has the following form:
struct shmid_ds
{
struct ipc_perm shm_perm; /* operation perms */
size_t 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 */
};
When creating a new shared memory segment, the system call initializes the shmid_ds 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.
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). |
A valid segment identifier, shmid, is returned on success, −1 on error.
On failure, errno is set to one of the following:
EINVAL |
if a new segment was to be created and size < SHMMIN or size > SHMMAX, or no new segment was to be created, a segment with given key existed, but size is greater than the size of that segment. | ||
EEXIST |
if IPC_CREAT | IPC_EXCL was specified and the segment exists. | ||
ENOSPC |
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 |
if no segment exists for the given key, and IPC_CREAT was not specified. | ||
EACCES |
if the user does not have permission to access the shared memory segment. | ||
ENOMEM |
if no memory could be allocated for segment overhead. |
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, was 128 before Linux 2.3.99). |
The implementation has no specific limits for the per process maximum number of shared memory segments (SHMSEG).
The name choice IPC_PRIVATE was perhaps unfortunate, IPC_NEW would more clearly show its function.
SVr4, SVID. SVr4 documents an additional error condition EEXIST. Until version 2.3.30 Linux would return EIDRM for a shmget on a shared memory segment scheduled for deletion.
ftok(3), ipc(5), shmctl(2), shmat(2), shmdt(2)
![]() |
shmget(2) | ![]() |