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

FreeBSD Manual Pages


home | help
SEMOP(2)		  FreeBSD System Calls Manual		      SEMOP(2)

     semop -- semaphore	operations

     #include <sys/sem.h>

     semop(int semid, struct sembuf *sops, size_t nsops);

     semop() provides a	number of atomic operations on a set of	semaphores.
     The semaphore set is specified by semid.  sops is an array	of semaphore
     operations, nsops is the number of	operations in this array.  The sembuf
     structures	in the array contain the following members:

	     u_short sem_num;	     /*	semaphore # */
	     short   sem_op;	     /*	semaphore operation */
	     short   sem_flg;	     /*	operation flags	*/

     Each operation (specified in sem_op) is applied to	semaphore number
     sem_num in	the set	of semaphores specified	by semid.  The value of	sem_op
     determines	the action taken in the	following way:

     +o	 sem_op	is less	than 0.	 The current process is	blocked	until the
	 value of the semaphore	is greater than	or equal to the	absolute value
	 of sem_op.  The absolute value	of sem_op is then subtracted from the
	 value of the semaphore, and the calling process continues.  Negative
	 values	of sem_op are thus used	to enter critical regions.

     +o	 sem_op	is greater than	0.  Its	value is added to the value of the
	 specified semaphore.  This is used to leave critical regions.

     +o	 sem_op	is equal to 0.	The calling process is blocked until the value
	 of the	specified semaphore reaches 0.

     The behavior of each operation is influenced by the flags set in sem_flg
     in	the following way:

     IPC_NOWAIT	  In the case where the	calling	process	would normally block,
		  waiting for a	semaphore to reach a certain value, IPC_NOWAIT
		  makes	the call return	immediately, returning a value of -1
		  and setting errno to EAGAIN.

     SEM_UNDO	  Keep track of	the changes that this call makes to the	value
		  of a semaphore, so that they can be undone when the calling
		  process terminates.  This is useful to prevent other pro-
		  cesses waiting on a semaphore	to block forever, should the
		  process that has the semaphore locked	terminate in a criti-
		  cal section.

     Upon successful completion, the value 0 is	returned; otherwise the
     value -1 is returned and the global variable errno	is set to indicate the

     semop() will fail if:

     [EINVAL]		There is no semaphore associated with semid.

     [EIDRM]		The semaphore set was removed while the	process	was
			waiting	for one	of its semaphores to reach a certain

     [EACCES]		The calling process has	no permission to access	the
			specified semaphore set.

     [E2BIG]		The value of nsops is too big.	The maximum is speci-
			fied in	MAX_SOPS in <sys/sem.h>.

     [EFBIG]		sem_num	in one of the sem_buf structures is less than
			0, or greater than the actual number of	semaphores in
			the set	specified by semid.

     [ENOSPC]		SEM_UNDO was requested,	and there is not enough	space
			left in	the kernel to store the	undo information.

     [EAGAIN]		The requested operation	cannot immediately be per-
			formed,	and IPC_NOWAIT was set in sem_flg.

     [EFAULT]		sops points to an illegal address.

     semctl(2),	semget(2)

FreeBSD	13.0		       November	1, 2015			  FreeBSD 13.0


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

home | help