- Fonction "semget"
#include < sys/types.h >
#include < sys/ipc.h >
#include < sys/sem.h >
int semget(key_t key, int nsems, int semflg);
La fonction "semget" crée un ensemble de sémaphores. L'entier retourné est le semid de l'ensemble de sémaphores ou -1 en cas d'erreur. semflag spécifie les priorités d'accès à l'ensemble de sémaphores. nsems désigne le nombre de sémaphores présents dans l'ensemble.
- Fonction "semctl"
#include < sys/types.h >
#include < sys/ipc.h >
#include < sys/sem.h >
union semun {
int val;
struct semid_ds *buf;
ushort *array
}
int semctl(int semid, int semnum, int cmd, semun arg);
La fonction "semctl" permet de réaliser des opérations de contrôle sur l'ensemble de sémaphores identifié par semid. semnum désigne le numéro du sémaphore de l'ensemble concerné par l'opération, arg un (ou des) argument(s) variant suivant la commande. Le type d'opération est spécifié par cmd :
- GETVAL : renvoie la valeur de semval du sémaphore semnum.
- SETVAL : affecte la valeur arg.val à semnum.
- IPC_RMID : détruit les sémaphores de l'ensemble, semid et semid_ds.
- Fonction "semop"
#include < sys/types.h >
#include < sys/ipc.h >
#include < sys/sem.h >
int semop(int semid, struct sembuf *sops, size_t nsops);
La fonction "semop" effectue une série d'opérations définies par les nsops éléments de sops, qui sont du type sembuf. Trois types d'opérations sont permis :
- sem_op < 0 (correspond au "P" : Proberen ou Puis-je ?)
- Si (semval >= |sem_op|), alors semval = semval - |sem_op|.
- Si (semval < |sem_op|), alors semncnt++ et le processus appelant est mis en attente jusqu'à ce que (semval >= |sem_op|). Ensuite, semncnt-- et semval=semval-|sem_op|.
- sem_op > 0 (correspond au "V" : Verhogen ou Vas-y !)
- semval = semval + sem_op.
- sem_op = 0
- Si (semval = 0), alors retour immédiat.
- Si (semval != 0), alors semzcnt++ et le processus appelant est mis en attente jusqu'à ce que (semval=0). Ensuite, semznct--.