Originální popis anglicky:
shmget - allocates a shared memory segment
Návod, kniha: Linux Programmer's Manual
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, int 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:
- 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 */
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 */
};
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:
- EACCES
- The user does not have permission to access the shared
memory segment, and does not have the CAP_IPC_OWNER
capability.
- EEXIST
- IPC_CREAT | IPC_EXCL was specified and the segment
exists.
- EINVAL
- 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.
- ENFILE
- The system limit on the total number of open files has been
reached.
- ENOENT
- No segment exists for the given key, and
IPC_CREAT was not specified.
- ENOMEM
- No memory could be allocated for segment overhead.
- ENOSPC
- All possible shared memory id's have been taken
(SHMMNI), or allocating a segment of the requested size
would cause the system to exceed the system-wide limit on shared memory
(SHMALL).
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.
shmat(2),
shmctl(2),
shmdt(2),
ftok(3),
ipc(5),
capabilities(7)