Semaphore API in Linux
POSIX named semaphore APIs we use in this lab are shown in the below table. You can look up manual pages for details of these functions. semaphore.c
shows how to use these functions to create, operate and remove named semaphore. Try it and make sure you understand it. Note that programs using the POSIX semaphores API must be compiled with -pthread
to link against the real-time library. So you need compile semaphore.c
like this:
gcc semaphore.c -pthreaad -o semaphore
Function | Description |
sem_open | Opens/creates a named semaphore for use by a process |
sem_wait | Wait on a semaphore |
sem_post | Signal a semaphore |
sem_close | Deallocates the specified named semaphore |
sem_unlink | Removes a specified named semaphore |
/*semaphore.c*/
#include <fcntl.h> /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <semaphore.h>
#include <stdio.h>
int main(int argc, char * argv[]){
char * name = "my_semaphore";
int VALUE = 2;
sem_t * sema;
//If semaphore with name does not exist, then create it with VALUE
printf("Open or Creat a named semaphore, %s, its value is %d\n", name,VALUE);
sema = sem_open(name, O_CREAT, 0666, VALUE);
//wait on semaphore sema and decrease it by 1
sem_wait(sema);
printf("Decrease semaphore by 1\n");
//add semaphore sema by 1
sem_post(sema);
printf("Add semaphore by 1\n");
//Before exit, you need to close semaphore and unlink it, when all processes have
//finished using the semaphore, it can be removed from the system using sem_unlink
sem_close(sema);
sem_unlink(name);
return 0;
}
Semaphore specification
Under Linux, the IPC comes in two flavors, the traditional System V IPC and the newer POSIX IPC. Both of them support semaphore. You can see their difference here.