NAME
	  semop	-  Performs semaphore operations

     SYNOPSIS
	  #include <sys/types.h>
	  #include <sys/ipc.h>
	  #include <sys/sem.h>
	  int semop(
	       int semid,
	       struct sembuf *sops,
	       u_int nsops);


     PARAMETERS
	  semid	    Specifies the ID of	the semaphore set.

	  sops	    Points to the user-defined array of	sembuf struc-
		    tures that contain the semaphore operations.

	  nsops	    The	number of sembuf structures in the array.


     DESCRIPTION
	  The semop() function performs	operations on the semaphores
	  in the specified semaphore set.  The semaphore operations
	  are defined in the sops array.  The sops array contains
	  nsops	elements, each of which	is represented by a sembuf
	  structure.

	  The sembuf structure (from sys/sem.h)	is shown here:
	       struct sembuf {
		       u_short		sem_num;
		       short	   sem_op;
		       short	   sem_flg; };

	  The fields in	the sembuf structure are defined as follows:


	  sem_num   Specifies an individual semaphore within the sema-
		    phore set.

	  sem_op    Specifies the operation to perform on the sem-
		    pahore.

	  sem_flg   Specifies various flags for	the operations.	 The
		    possible values are:


		    SEM_UNDO  Instructs	the kernel to adjust the
			      process's	adjust-on-exit value for a
			      modified semaphore.  When	the process
			      exits, the kernel	uses this value	to
			      restore the semaphore to the value it
			      had before any modifications by the pro-
			      cess.  This flag is used to prevent
			      semaphore	locking	by a process that no
			      longer exists.

		    IPC_NOWAIT
			      Instructs	the kernel to return an	error
			      condition	if a requested operation would
			      cause the	process	to sleep.  If the ker-
			      nel returns an error condition, none of
			      the requested semaphore operations are
			      performed.


	  The sem_op operation is specified as a negative integer, a
	  positive integer, or 0 (zero).  The effects of these three
	  values are described below.

	  If sem_op is a negative integer and the calling process has
	  modify permission, the semop() function does one of the fol-
	  lowing:


	    o  If the semaphore's current value	(in semval) is equal
	       to or greater than the absolute value of	sem_op,	the
	       absolute	value of sem_op	is subtracted from semval.  If
	       SEM_UNDO	is set,	the absolute value of sem_op is	added
	       to the calling process' adjust-on-exit value for	the
	       semaphore.

	    o  If semval is less than the absolute value of sem_op and
	       IPC_NOWAIT is set, semop() returns immediately with an
	       [EAGAIN]	error.

	    o  If semval is less than the absolute value of sem_op and
	       IPC_NOWAIT is not set, semop() increments the
	       semaphore's semncnt value and suspends the calling pro-
	       cess.


	  If the process is suspended, it sleeps until one of the fol-
	  lowing occurs:


	    o  The semval value	becomes	equal to or greater than the
	       absolute	value of sem_op.  In this case,	the
	       semaphore's semncnt value is decremented; the absolute
	       value of	sem_op is subtracted from semval; and, if
	       SEM_UNDO	is set,	the absolute value of sem_op is	added
	       to the calling process's	adjust-on-exit value for the
	       semaphore.

	    o  The semaphore set (specified by semid) is removed from
	       the system.  In this case, errno	is set equal to
	       [EIDRM] and a value of -1 is returned to	the calling
	       process.

	    o  The calling process catches a signal.  In this case,
	       the semaphore's semncnt value is	decremented, and the
	       calling process resumes execution as directed by	the
	       signal()	function.


	  If sem_op is a positive integer and the calling process has
	  modify permission, semop() adds the sem_op value to the
	  semaphaore's current semval value.  If SEM_UNDO is set, the
	  sem_op value is subtracted from the calling process's
	  adjust-on-exit value for the semaphore.

	  If sem_op is 0 (zero)	and the	calling	process	has read per-
	  mission, semop() does	one of the following:


	    o  If semval is 0, semop() returns immediately.

	    o  If semval is not	equal to 0 and IPC_NOWAIT is set,
	       semop() returns immediately.

	    o  If semval is not	equal to 0 and IPC_NOWAIT is not set,
	       semop() increments the semaphore's semzcnt value	and
	       suspends	the calling process.


	  If the process is suspended, it sleeps until one of the fol-
	  lowing occurs:


	    o  The semval value	becomes	0 (zero).  In this case, the
	       semaphore's semncnt value is decremented.

	    o  The semaphore set (specified by semid) is removed from
	       the system.  In this case, errno	is set equal to
	       [EIDRM] and a value of -1 is returned to	the calling
	       process.

	    o  The calling process catches a signal.  In this case,
	       the semaphore's semncnt value is	decremented, and the
	       calling process resumes execution as directed by	the
	       signal()	function.


     NOTES
	  Semaphore operations are performed atomically;  that is,
	  either all of	the requested operations are performed,	or
	  none are.  If	the kernel goes	to sleep while doing the
	  operations, it restores all of the semaphores	in the set to
	  their	previous values, at the	start of the semop() function.

     RETURN VALUES
	  Upon successful completion, the semop() function returns a
	  value	of 0 (zero) and	the sempid value for each semaphore
	  that is operated upon	is set to the process ID of the	cal-
	  ling process.

	  If the semop() function fails, a value of -1 is returned and
	  errno	is set to indicate the error.

     ERRORS
	  If the semop() function fails, errno may be set to one of
	  the following	values:


	  [EINVAL]  The	semid parameter	is not a valid semaphore ID,
		    or the number of semaphores	for which SEM_UNDO is
		    requested exceeds the system-defined limit.

	  [EFBIG]   The	sem_num	parameter is less than 0 (zero)	or
		    greater than or equal to the number	of semaphores
		    in semid.

	  [E2BIG]   The	nsops parameter	is greater than	the system-
		    defined maximum.

	  [EACCES]  The	calling	process	does not have the required
		    permission.

	  [EAGAIN]  Both sem_flg and IPC_NOWAIT	are true, but the
		    requested operation	has caused the calling process
		    to be suspended.

	  [ENOSPC]  The	system-defined limit on	the number of
		    processes using SEM_UNDO was exceeded.

	  [ERANGE]  An operation caused	a semval to overflow the
		    system-defined limit, or an	operation caused an
		    adjust-on-exit value to exceed the system-defined
		    limit.

	  [EINTR]   The	semop()	function was interrupted by a signal.

	  [EIDRM]   The	semaphore ID specified by the semid parameter
		    has	been removed from the system.

	  [ENOSYS]  The	requested operation is not supported by	this
		    implementation.

     RELATED INFORMATION
	  Functions: exec(2), exit(2), fork(2),	semctl(2), semget(2)

	  Data Structures: semid_ds(4)
















































Acknowledgement and Disclaimer