shmat(2)




NAME

     shmop, shmat, shmdt - shared memory operations


SYNOPSIS

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

     void *shmat(int shmid, const void *shmaddr, int shmflg);

  Default
     int shmdt(char *shmaddr);

  Standard conforming
     int shmdt(const void *shmaddr);


DESCRIPTION

     The shmat() function  attaches  the  shared  memory  segment
     associated  with  the  shared memory identifier specified by
     shmid to the data segment of the calling process.

     The permission required for a shared memory  control  opera-
     tion is given as {token}, where token is the type of permis-
     sion needed. The types of permission are interpreted as fol-
     lows:

     00400    READ by user
     00200    WRITE by user
     00040    READ by group
     00020    WRITE by group
     00004    READ by others
     00002    WRITE by others

     See the  Shared  Memory  Operation  Permissions  section  of
     intro(2) for more information.

     When  (shmflg&SHM_SHARE_MMU)   is   true,   virtual   memory
     resources  in  addition  to  shared memory itself are shared
     among processes that use the same shared memory.

     When (shmflg&SHM_PAGEABLE) is true, virtual memory resources
     are shared and the dynamic shared memory (DISM) framework is
     created. The dynamic shared memory can  be  resized  dynami-
     cally  within  the  specified  size  in  shmget(2). The DISM
     shared memory is pageable unless it is locked.

     The shared memory segment is attached to the data segment of
     the calling process at the address specified based on one of
     the  following criteria:

        o  If shmaddr is equal to (void  *)  0,  the  segment  is
           attached to the first available address as selected by
           the system.

        o  If   shmaddr  is  equal  to   (void   *)   0   and   (
           shmflg&SHM_SHARE_MMU)   or   (shmflg&SHM_PAGEABLE)  is
           true, then the segment is attached to the first avail-
           able      suitably      aligned      address.     When
           (shmflg&SHM_SHARE_MMU)  or  (shmflg&SHM_PAGEABLE)   is
           set, however, the permission given by  shmget() deter-
           mines whether the segment is attached for  reading  or
           reading and writing.

        o  If  shmaddr  is  not  equal  to   (void   *)   0   and
           (shmflg&SHM_RND)  is  true, the segment is attached to
           the address given  by  (shmaddr  -   (shmaddr  modulus
           SHMLBA)).

        o  If  shmaddr  is  not  equal  to   (void   *)   0   and
           (shmflg&SHM_RND)  is false, the segment is attached to
           the address given by shmaddr.

        o  The   segment   is    attached    for    reading    if
           (shmflg&SHM_RDONLY)  is  true  {READ}, otherwise it is
           attached for reading and writing {READ/WRITE}.

     The shmdt() function detaches  from  the  calling  process's
     data  segment  the  shared  memory  segment  located  at the
     address  specified  by  shmaddr.  If  the   application   is
     standard-conforming (see standards(5)), the shmaddr argument
     is of type const void *. Otherwise it is of type char *.

     Shared memory segments must be explicitly removed after  the
     last reference to them has been removed.


RETURN VALUES

     Upon successful completion, shmat() returns the data segment
     start address of the attached shared memory segment; shmdt()
     returns 0. Otherwise, -1 is returned, the shared memory seg-
     ment  is  not  attached,  and  errno  is set to indicate the
     error.


ERRORS

     The shmat() function will fail if:

     EACCES
           Operation permission is denied to the calling  process
           (see intro(2)).

     EINVAL
           The shmid argument is not a valid shared memory  iden-
           tifier.

     EINVAL
           The shmaddr argument is not equal to 0, and the  value
           of (shmaddr -  (shmaddr modulus SHMLBA)) is an illegal
           address.

     EINVAL
           The shmaddr argument is not equal to 0, is an  illegal
           address, and (shmflg&SHM_RND) is false.

     EINVAL
           The shmaddr argument is not equal to 0, is  not  prop-
           erly aligned, and (shmfg&SHM_SHARE_MMU) is true.

     EINVAL
           SHM_SHARE_MMU is not supported  in  certain  architec-
           tures.

     EMFILE
           The number of shared memory segments attached  to  the
           calling process would exceed the system-imposed limit.

     ENOMEM
           The available data  space   is  not  large  enough  to
           accommodate the shared memory segment.

     The shmdt() function will fail if:

     EINVAL
           The shmaddr argument is not  the  data  segment  start
           address of a shared memory segment.


SEE ALSO

     intro(2), exec(2), exit(2), fork(2),  shmctl(2),  shmget(2),
     standards(5)


Man(1) output converted with man2html