NAME

     shmget - allocates a shared memory segment


SYNOPSIS

     #include <sys/ipc.h>

     #include <sys/shm.h>

     int shmget(key_t key, int size, int shmflg


DESCRIPTION

     shmget() returns the identifier of the shared memory segment
     associated  to  the value of the argument key.  A new shared
     memory segment, with size equal to the round up of size to a
     multiple   of   PAGE_SIZE,  is  created  if  key  has  value
     IPC_PRIVATE or key isn't IPC_PRIVATE, no shared memory  seg-
     ment  is  associated  to  key,  and IPC_CREAT is asserted in
     shmflg (i.e.  shmflg&IPC_CREAT isn't zero).  The presence in

     shmflg is composed of:

     IPC_CREAT   to create a new segment. If  this  flag  is  not
                 used,  then shmget() will find the segment asso-
                 ciated with key, check to see if  the  user  has
                 permission  to receive the shmid associated with
                 the segment,  and  ensure  the  segment  is  not
                 marked for destruction.

     IPC_EXCL    used with IPC_CREAT to  ensure  failure  if  the
                 segment exists.

     mode_flags (lowest 9 bits)
                 specifying the permissions granted to the owner,
                 group,  and  world.  Presently, the execute per-
                 missions 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:

          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 */
          };

     Furthermore, while creating, the system call initializes the
     system shared memory segment data structure shmid_ds as fol-
     lows:

          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 per-
     missions  are  verified, and a check is made to see if it is
     marked for destruction.


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

     A valid segment identifier, shmid, is returned  on  success,
     -1 on error.


ERRORS

     On failure, errno is set to one of the following:

     EINVAL      is returned if SHMMIN > size or size  >  SHMMAX,
                 or size is greater than size of segment.

     EEXIST      is returned if IPC_CREAT | IPC_EXCL  was  speci-
                 fied and the segment exists.

     EIDRM       is returned if the segment  is  marked  as  des-
                 troyed, or was removed.

     ENOSPC      is returned if all possible shared  memory  id's
                 have  been  taken  or if allocating a segment of
                 the requested size would  cause  the  system  to
                 exceed the system-wide limit on shared memory

     ENOENT      is returned if no segment exists for  the  given
                 key, and IPC_CREAT was not specified.

     EACCES      is returned if the user does not have permission
                 to access the shared memory segment.

     ENOMEM      is returned if no memory could be allocated  for
                 segment overhead.


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:  pol-
                icy dependent.

     SHMMAX     Maximum size in bytes for a  shared  memory  seg-
                ment: implementation dependent (currently 4M).

     SHMMIN     Minimum size in bytes for a  shared  memory  seg-
                ment: implementation dependent (currently 1 byte,
                though PAGE_SIZE is the effective minimum size).

     SHMMNI     System wide maximum number of shared memory  seg-
                ments: implementation dependent (currently 4096).

     The implementation has no specific limits for the  per  pro-
     cess maximum number of shared memory segments (SHMSEG).


BUGS

     Use of IPC_PRIVATE doesn't inhibit to  other  processes  the
     access to the allocated shared memory segment.

     As for the files, there is currently no intrinsic way for  a
     process  to  ensure exclusive access to a shared memory seg-
     ment.  Asserting both IPC_CREAT and IPC_EXCL in shmflg  only
     ensures  (on  success) that a new shared memory segment will
     be created, it doesn't imply exclusive access  to  the  seg-
     ment.


CONFORMING TO

     SVr4, SVID.  SVr4 documents an  additional  error  condition
     EEXIST.  Neither SVr4 nor SVID documents an EIDRM condition.


SEE ALSO

     ftok(3), ipc(5), shmctl(2), shmat(2), shmdt(2).