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.
On HP Scalable Computing Architecture (SCA) systems with multiple
locality domains, specifying
IPC_MEM_LOCAL
in
shmflag
targets the shared memory to the locality on which the
allocating thread is executing at the time of the call.
This overrides the default allocation policy of "first touch",
in which memory is allocated from the locality domain on which
the thread is executing at the time of the fault. When
IPC_MEM_LOCAL
is specified:
Should there not be enough memory available in the specified locality
domain to satisfy the request, memory is allocated
from the domain on which the thread is currently executing.
On systems with a single locality domain, the call has no effect.
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 processes 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