*nix Documentation Project
·  Home
 +   man pages
·  Linux HOWTOs
·  FreeBSD Tips
·  *niX Forums

  man pages->IRIX man pages -> standard/shmop (2)              
Title
Content
Arch
Section
 

Contents


shmop(2)							      shmop(2)


NAME    [Toc]    [Back]

     shmop: shmat, shmdt - shared memory operations

C SYNOPSIS    [Toc]    [Back]

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

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

     int shmdt (void *shmaddr);

DESCRIPTION    [Toc]    [Back]

     shmat attaches the	shared memory segment associated with the shared
     memory identifier specified by shmid to the data segment of the calling
     process.  The segment is attached at the address specified	by one of the
     following criteria:

	  If shmaddr is	equal to (void *) 0, the segment is attached at	the
	  first	available address as selected by the system.  If
	  (shmflg<b>&SHM_SGI_ANYADDR) is true, the	segment	is attached at the
	  first	available address, otherwise the system	selects	an available
	  address that is outside of the reserved area between 0x30000000 and
	  0x40000000.  See mmap(2) and sgi_use_anyaddr(1) for more information
	  on the reserved range.

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

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

     The actual	argument corresponding to shmaddr is evaluated by setting an
     INTEGER*4 variable	to the location	of the process's data segment, in
     other words, the value returned by	%loc(3F).

     Under certain conditions, performance can be greatly improved by sharing
     mapping resources among processes attached	to the same SHM	segment. In
     order to achieve sharing of mapping resources, the	following conditions
     must hold:

     -	 the size of the SHM segment is	a multiple of the constant SHMSUS (SHM
	 Segment Unit Size).

     -	 the attaching address shmaddr is a multiple of	SHMSUS.

     -	 (shmflg<b>&SHM_RDONLY) is	false

     The caller	authorizes the system to use shared mapping resources by
     setting the flag SHM_SHATTR in shmflg.




									Page 1






shmop(2)							      shmop(2)



     If	(shmflg<b>&SHM_SHATTR) is true and	the above conditions are met the
     system uses shared	mapping	resources.

     If	(shmflg<b>&SHM_SHATTR) is true and	any of the above conditions are	false
     the system	call fails.

     Use of the	SHM_SHATTR flag	is discouraged in the following	situations:

     -	  if the calling process is likely to unmap (munmap(2))	or to re-map
	  (mmap(2)) large portions of the SHM segment, or

     -	  if the calling process is likely to change the mapping attributes
	  (access permissions and cache	policies) on large portions of the SHM
	  segment (mprotect(2)).

     These behaviors cause the system to make private copies of	mapping
     resources and stop	sharing, thereby defeating the purpose of the
     SHM_SHATTR	capability.

     shmdt detaches from the calling process's data segment the	shared memory
     segment located at	the address specified by shmaddr.

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

     shmat fails and does not attach the shared	memory segment if one or more
     of	the following are true:

     EINVAL	    shmid is not a valid shared	memory identifier.

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

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

     EINVAL	    shmaddr is not equal to zero, and the value	of (shmaddr <b>-
		    (shmaddr modulus SHMLBA)) is an illegal address.

     EINVAL	    shmaddr is not equal to zero, (shmflg<b>&SHM_RND) is false,
		    and	the value of shmaddr is	an illegal address.

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

     EINVAL	    shmaddr is not a multiple of SHMSUS	and
		    (shmflg<b>&SHM_SHATTR)	is true, or the	size of	the SHM
		    segment is not a multiple of SHMSUS	and
		    (shmflg<b>&SHM_SHATTR)	is true.






									Page 2






shmop(2)							      shmop(2)



     EACCES	    (shmflg<b>&SHM_SHATTR)	is true	and (shmflg<b>&SHM_RDONLY)	is
		    true.

     EINVAL	    shmdt fails	and does not detach the	shared memory segment
		    if shmaddr is not the data segment start address of	a
		    shared memory segment.

SEE ALSO    [Toc]    [Back]

      
      
     sgi_use_anyaddr(1), exec(2), exit(2), fork(2), intro(2), shmctl(2),
     shmget(2),	sproc(2).

DIAGNOSTICS    [Toc]    [Back]

     Upon successful completion, the return value is as	follows:

	  shmat	returns	the data segment start address of the attached shared
	  memory segment.

	  shmdt	returns	a value	of 0.

     Otherwise,	a value	of -1 is returned and errno is set to indicate the
     error.

NOTES    [Toc]    [Back]

     The user must explicitly remove shared memory segments after the last
     reference to them has been	removed.


									PPPPaaaaggggeeee 3333
[ Back ]
 Similar pages
Name OS Title
shmctl OpenBSD shared memory control operations
shmctl NetBSD shared memory control operations
shmctl HP-UX shared memory control operations
shmctl IRIX shared memory control operations
shmctl Tru64 Perform shared memory control operations
shm_open FreeBSD open or create a shared memory object shm_unlink -- remove a shared memory object
shmat OpenBSD map/unmap shared memory
shmget HP-UX get shared memory segment
shmdt OpenBSD map/unmap shared memory
shmx Tru64 shared memory exerciser
Copyright © 2004-2005 DeniX Solutions SRL
newsletter delivery service