NAME

     shmop - shared memory operations


SYNOPSIS

     # include <sys/types.h>
     # include <sys/ipc.h>
     # include <sys/shm.h>

     char *shmat ( int shmid, char *shmaddr, int shmflg )

     int shmdt ( char *shmaddr))


DESCRIPTION

     The function shmat attaches the shared memory segment  iden-
     tified  by shmid to the data segment of the calling process.
     The attaching address is specified by shmaddr  with  one  of
     the following criteria:

          If shmaddr is 0, the system tries to find  an  unmapped
          region  in  the  range 1 - 1.5G starting from the upper
          value and coming down from there.

          If shmaddr isn't 0 and SHM_RND is asserted  in  shmflg,
          the attach occurs at address equal to the rounding down
          of shmaddr to a multiple of SHMLBA.  Otherwise  shmaddr
          must  be  a  page  aligned  address at which the attach
          occurs.

     If SHM_RDONLY is asserted in shmflg, the segment is attached
     for  reading  and  the process must have read access permis-
     sions to the segment.  Otherwise the segment is attached for
     read  and  write  and  the  process must have read and write
     access permissions to the segment.  There is  no  notion  of
     write-only shared memory segment.

     The brk value of the calling process is not altered  by  the
     attach.   The segment will automatically detached at process
     exit.  The same segment may be attached as a read and  as  a
     read-write one, and more than once, in the process's address
     space.

     On a successful shmat call the system updates the members of
     the  structure shmid_ds associated to the shared memory seg-
     ment as follows:

          shm_atime is set to the current time.

          shm_lpid is set to the process-ID of the  calling  pro-
          cess.

          shm_nattch is incremented by one.

     Note that the attach succeeds also if the shared memory seg-
     ment is marked as to be deleted.

     The function shmdt detaches from the calling process's  data
     segment  the  shared  memory  segment located at the address
     specified by shmaddr.  The detaching shared  memory  segment
     must  be  one  among  the  currently  attached  ones (to the
     process's address space) with shmaddr  equal  to  the  value
     returned by the its attaching shat call.

     On a successful shmdt call the system updates the members of
     the  structure shmid_ds associated to the shared memory seg-
     ment as follows:

          shm_dtime is set to the current time.

          shm_lpid is set to the process-ID of the  calling  pro-
          cess.

          shm_nattch is decremented by one.  If it becomes 0  and
          the  segment  is  marked  for  deletion, the segment is
          deleted.

     The occupied region in the user space of the calling process
     is unmapped.


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).


RETURN VALUE

     On a failure both functions return -1 with errno  indicating
     the  error,  otherwise  shmat  returns  the  address  of the
     attached shared memory segment, and shmdt returns 0.


ERRORS

     When shmat fails, at return errno will be set to  one  among
     the following values:

     EACCES     The calling process has no access permissions for
                the requested attach type.

     EINVAL     Invalid shmid value, unaligned (i.e.,  not  page-
                aligned and SHM_RND was not specified) or invalid
                shmaddr value, or failing attach at brk.

     ENOMEM     Could not allocate memory for the  descriptor  or
                for the page tables.

     The function shmdt can fails only  if  there  is  no  shared
     memory segment attached at shmaddr, in such a case at return
     errno will be set to EINVAL.


NOTES

     On executing a fork(2) system call, the child  inherits  all
     the attached shared memory segments.

     The shared memory segments attached to a  process  executing
     an execve(2) system call will not be attached to the result-
     ing process.

     The following is a system parameter affecting a shmat system
     call:

     SHMLBA     Segment low boundary address multiple.   Must  be
                page aligned.  For the current implementation the
                SHMBLA value is PAGE_SIZE.

     The implementation has no intrinsic limit to the per process
     maximum number of shared memory segments (SHMSEG)


CONFORMING TO

     SVr4, SVID.  SVr4 documents an  additional  error  condition
     EMFILE.


SEE ALSO

     ipc(5), shmctl(2), shmget(2).