Computer Science
SHMGET(2) Linux Programmer's Manual SHMGET(2)
NAME
shmget - allocates a shared memory segment
SYNOPSIS
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, int size, int shmflg);
DESCRIPTION
shmget() returns the identifier of the shared memory seg-
ment 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 mem-
ory 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.
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 exe-
cute 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 struc-
ture:
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 seg-
ments 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 speci-
fied 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 permis-
sion to access the shared memory segment.
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 cre-
ates 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 seg-
ment: implementation dependent (currently 4M).
SHMMIN Minimum size in bytes for a shared memory seg-
ment: 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 pro-
cess 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 condi-
tion.
SEE ALSO
ftok(3), ipc(5), shmctl(2), shmat(2), shmdt(2).
Linux 0.99.11 November 28, 1993 1
Back to the index