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

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