shmop(2) shmop(2)
NAME
shmop: shmat, shmdt - shared memory operations
SYNOPSIS
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt (const void *shmaddr);
DESCRIPTION
shmat() attaches the shared memory segment associated with the shared
memory identifier specified by shmid to the data segment of the cal-
ling process. The segment is attached at the address specified by one
of the following criteria:
- If shmaddr is equal to (void *) 0, the segment is attached at the
first available address as selected by the system.
- If shmaddr is not equal to (void *) 0 and (shmflg&SHMRND) is true,
the segment is attached at the address given by
(shmaddr - ((ptrdifft)shmaddr%SHMLBA)).
- If shmaddr is not equal to (void *) 0 and (shmflg&SHMRND) is
false, the segment is attached at the address given by shmaddr.
shmdt() detaches from the calling process' data segment the shared
memory segment located at the address specified by shmaddr.
The segment is attached for reading if (shmflg&SHMRDONLY) is true
otherwise it is attached for reading and writing.
shmat() fails and does not attach the shared memory segment if one or
more of the following apply:
EINVAL shmid is not a valid shared memory identifier.
EACCES Operation permission is denied to the calling process.
ENOMEM The available data space is not large enough to accommodate
the shared memory segment.
EINVAL shmaddr is not equal to zero, and the value of
(shmaddr - ((ptrdifft)shmaddr%SHMLBA)) is an illegal
address.
EINVAL shmaddr is not equal to zero, (shmflg&SHMRND) is false, and
the value of shmaddr is an illegal address.
EMFILE The number of shared memory segments attached to the calling
process would exceed the system-imposed limit.
Page 1 Reliant UNIX 5.44 Printed 11/98
shmop(2) shmop(2)
EINVAL shmdt() fails and does not detach the shared memory segment
if shmaddr is not the data segment start address of a shared
memory segment.
EINVAL This executable is a specially preloaded binary. The argu-
ment shmaddr lies illegally between the text and data
regions.
RESULT
Upon successful completion, the result is as follows:
shmat() returns the data segment start address of the attached
shared memory segment.
shmdt() returns a value of 0.
Otherwise, a value of -1 is returned and errno is set to indicate the
error.
NOTES
The user must explicitly remove shared memory segments after the last
reference to them has been removed.
In the future there may be modifications to the interfaces for inter-
process communication. You should design your applications so that in
modules using shmop() this function can easily be replaced by others.
SEE ALSO
exec(2), exit(2), fork(2), shmctl(2), shmget(2), preload(8).
Page 2 Reliant UNIX 5.44 Printed 11/98