Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
SHMGET(2)		   Linux Programmer's Manual		     SHMGET(2)

       shmget -	allocates a shared memory segment

       #include	<sys/ipc.h>

       #include	<sys/shm.h>

       int shmget(key_t	key, int size, int shmflg);

       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 cre-
       ated if key has value IPC_PRIVATE or key	isn't IPC_PRIVATE,  no	shared
       memory  segment is associated to	key, and IPC_CREAT is asserted in shm-
       flg (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, check
		   to see if the user has permission to	receive	the shmid  as-
		   sociated  with  the	segment, and ensure the	segment	is not
		   marked for destruction.

       IPC_EXCL	   used	with IPC_CREAT to ensure failure if  the  segment  ex-

       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.

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

       If the shared memory segment already exists, the	access permissions are
       verified, and a check is	made to	see if it is marked for	destruction.

       fork() After a fork() the child inherits	 the  attached	shared	memory

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

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

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

       EINVAL	   is  returned	 if a new segment was to be created and	size <
		   SHMMIN or size > SHMMAX, or no new segment was to  be  cre-
		   ated, a segment with	given key existed, but size is greater
		   than	the size of that segment.

       EEXIST	   is returned if IPC_CREAT | IPC_EXCL was specified  and  the
		   segment exists.

       EIDRM	   is  returned	 if the	segment	is marked as destroyed,	or was

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

       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

       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 or-
       der 9 bits of shmflg and	creates	a new shared memory segment  (on  suc-

       The  followings are limits on shared memory segment resources affecting
       a shmget	call:

       SHMALL	  System wide maximum of shared	memory	pages:	policy	depen-

       SHMMAX	  Maximum size in bytes	for a shared memory segment: implemen-
		  tation dependent (currently 4M).

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

       SHMMNI	  System wide maximum number of	shared memory segments:	imple-
		  mentation  dependent	(currently  4096, was 128 before Linux

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

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

       There is	currently no intrinsic way for a process to  ensure  exclusive
       access  to  a  shared  memory  segment.	 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-

       SVr4, SVID.  SVr4 documents an additional error condition EEXIST.  Nei-
       ther SVr4 nor SVID documents an EIDRM condition.

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

Linux 0.99.11			  1993-11-28			     SHMGET(2)


Want to link to this manual page? Use this URL:

home | help