Per colmare questo vuoto lo standard Posix offre un nuovo tipo di dato, sem_t che è un'implementazione del classico meccanismo semaforico. Meccanismi analoghi potrebbero essere costruiti di volta in volta sfruttando le primitive e i tipi di dato già visti (è il caso dell'esempio 6.3.1) ma questo complicherebbe ogni volta la scrittura del programma. Si deve considerare questo tipo di dato, e le relative primitive associate, come un'utile scorciatoia offerta al programmatore.
Data la sua diversa natura non è stata prevista una macro di inizializzazione di un semaforo, per cui esso dovrà essere esplicitamente inizializzato con il valore voluto tramite la primitiva:
#include<semaphore.h>
int sem_init(sem_t *sem, int pshared,
unsigned int value);
|
Argomenti in ingresso :
Valore restituito :
Dopo aver istanziato una variabile di tipo sem_t ed averla inizializzata con la primtiva appena vista potremo operare su di essa con le seguenti primitive :
#include<semaphore.h>
int sem_wait(sem_t *sem);
|
Argomenti in ingresso :
Valore restituito :
Queste due funzioni rappresentano il modo classico di operare su dei semafori per cui non ci si dilungherà ulteriormente sul loro uso.
Per completezza riportiamo le seguenti primitive che operano sui semafori :
#include<semaphore.h>
int sem_trywait(sem_t *sem);
|
Tale primitiva è la versione non bloccante della sem_wait.
Argomenti in ingresso :
Lo standard Posix definisce anche una primitiva per potere leggere il valore attuale di un semaforo :
#include<semaphore.h>
int sem_getvalue(sem_t *sem, int *sval));
|
Argomenti in ingresso :
Per entrambe le primitive vale quanto visto sopra riguardo al valore di ritorno.