966 Chapter 47
the use of a semaphore to synchronize the actions of two processes that alternately
move the semaphore value between 0 and 1.
Figure 47-1: Using a semaphore to synchronize two processes
In terms of controlling the actions of a process, a semaphore has no meaning in
and of itself. Its meaning is determined only by the associations given to it by the
processes using the semaphore. Typically, processes agree on a convention that
associates a semaphore with a shared resource, such as a region of shared memory.
Other uses of semaphores are also possible, such as synchronization between par-
ent and child processes after fork(). (In Section 24.5, we looked at the use of signals
to accomplish the same task.)
47.1 Overview
The general steps for using a System V semaphore are the following:
z Create or open a semaphore set using semget().
z Initialize the semaphores in the set using the semctl() SETVAL or SETALL operation.
(Only one process should do this.)
z Perform operations on semaphore values using semop(). The processes using
the semaphore typically use these operations to indicate acquisition and
release of a shared resource.
z When all processes have finished using the semaphore set, remove the set using
the semctl() IPC_RMID operation. (Only one process should do this.)
Most operating systems provide some type of semaphore primitive for use in appli-
cation programs. However, System V semaphores are rendered unusually complex
by the fact that they are allocated in groups called semaphore sets. The number of
Process A Process B
Time
blocks
blocks
resumes
resumes
Create semaphore
Initialize semaphore to 0
Add 1 to semaphore
Subtract 1 from semaphore
Subtract 1 from semaphore
Add 1 to semaphore