[Linux manuál]
Návod, kniha: Linux Programmer's Manual
#include <sys/shm.h>
int shmget(key_t key, int size, int
shmflg);
shmget: přiděluje segment sdílené paměti
Originální popis anglicky: shmget - allocates a shared memory segmentNávod, kniha: Linux Programmer's Manual
STRUČNĚ
#include <sys/ipc.h>POPIS / INSTRUKCE
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.
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.
SYSTEM CALLS
- 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).
NÁVRATOVÁ HODNOTA
A valid segment identifier, shmid, is returned on success, -1 on error.CHYBY / ERRORY
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).
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 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).
BUGS
The name choice IPC_PRIVATE was perhaps unfortunate, IPC_NEW would more clearly show its function.ODPOVÍDAJÍCÍ
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.SOUVISEJÍCÍ
shmat(2), shmctl(2), shmdt(2), ftok(3), ipc(5), capabilities(7)| 2004-06-17 | Linux 2.6.7 |