NAME
shmget — get shared memory segment
SYNOPSIS
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
DESCRIPTION
shmget()
returns the shared memory identifier associated with
key.
A shared memory identifier and associated data structure
and shared memory segment of size
size
bytes (see
glossary(9))
are created for
key
if one of the following is true:
key
is equal to
IPC_PRIVATE.
This call creates a new identifier, subject to available resources.
The identifier will never be returned by another call to
shmget()
until it has been released by a call to
shmctl().
The identifier should be used among the calling process and its descendents;
however, it is not a requirement.
The resource can be accessed by any process having the proper permissions.
key
does not already have a shared memory identifier associated with it, and
(shmflg &
IPC_CREAT)
is ``true''.
If
IPC_CREAT
is set in
shmflg
the shared memory segment created can only be shared by processes of the
same executable type. That is, an application compiled as a 32-bit process will
be able to share the same memory segment with other 32-bit processes, and an
application compiled as a 64-bit process will be able to share the same
memory segment with other 64-bit processes. If a 64-bit bit process wants
to create a shared memory segment which can also be shared with 32-bit
processes, the 64-bit process must specify
IPC_SHARE32
in addition to
IPC_CREAT
in
shmflg.
The 32-bit process does not need to specify
IPC_SHARE32.
Upon creation, the data structure associated
with the new shared memory identifier is initialized as follows:
shm_perm.cuid,
shm_perm.uid,
shm_perm.cgid,
and
shm_perm.gid
are set equal to the effective user
ID
and effective group
ID,
respectively, of the calling process.
shm_perm.cuid,
The low-order 9 bits of
shm_perm.mode
are set equal to the low-order 9 bits of
shmflg.
shm_segsz
is set equal to the value of
size.
shm_lpid,
shm_nattch,
shm_atime,
and
shm_dtime
are set equal to 0.
shm_ctime
is set equal to the current time.
EXAMPLES
The following call to
shmget()
returns a unique shmid for the newly created
shared memory segment of 4096 bytes:
int myshmid;
myshmid = shmget (IPC_PRIVATE, 4096, 0600);
RETURN VALUE
Upon successful completion, a non-negative integer,
namely a shared memory identifier is returned.
Otherwise, a value of -1 is returned and
errno
is set to indicate the error.
ERRORS
shmget()
fails if any of the following conditions are encountered:
- [EINVAL]
size
is less than the system-imposed minimum
or greater than the system-imposed maximum.
- [EINVAL]
A shared memory identifier exists for
key
but is in 64-bit address space and the process performing the
request has been compiled as a 32-bit executable. In order to
avoid receiving this error, both
IPC_SHARE32
and
IPC_CREAT
must be set in
shmflg
by the 64-bit procses upon segment creation.
- [EACCES]
A shared memory identifier exists for
key
but operation permission (see
glossary(9))
as specified by the low-order 9 bits of
shmflg
would not be granted.
- [EINVAL]
A shared memory identifier exists for
key
but the size of the segment associated with it is less than
size
and
size
is not equal to zero.
- [ENOENT]
A shared memory identifier does not exist for
key
and
(shmflg &
IPC_CREAT)
is ``false''.
- [ENOSPC]
A shared memory identifier is to be created but
the system-imposed limit on the maximum number of
allowed shared memory identifiers system wide would be exceeded.
- [ENOMEM]
A shared memory identifier and associated shared memory segment
are to be created, but the amount of available physical memory
is not sufficient to fill the request.
- [EEXIST]
A shared memory identifier exists for
key
but
((shmflg
&
IPC_CREAT)
&&
(shmflg
&
IPC_EXCL))
is ``true''.
STANDARDS CONFORMANCE
shmget(): SVID2, SVID3, XPG2, XPG3, XPG4