- Ensemble de sémaphores: A chaque élément
de cet ensemble correspond dans le noyau une entrée dans une liste
chainée.
- Opérations: Retrancher ou ajouter un entier à
un sémaphore particulier de l'ensemble.
/usr/include/sys/ipc.h
/usr/include/sys/types.h
/usr/include/sys/sem.h
int semget(key_t cle, int
nbsem, int semflg): Renvoie l'identificateur
de l'ensemble de sémaphores de clé externe unique
cle. Si l'ensemble n'existe pas et si semflg contient
IPC_CREAT , semget crée un ensemble de nbsem
sémaphores de droits d'accès définis dans semflg
. Cette fonction renvoie -1 si erreur.
exemple:
Num=semget(1000, 2, 0666|IPC_CREAT); crée
un tableau de 2 sémaphores numérotés 0 et 1, de clé
externe 1000. Num est la clé interne.
int semop(int semid,
struct sembuf* semoper, int nbop):
réalise les nbop opérations
décrites dans le tableau d'opérations semoper
. Décrémenter un sémaphore peur bloquer le processus
ou non (renvoie -1 dans ce cas) en fonction de l'option choisie (bit IPC_NOWAIT,
cf. sem_flg ci-dessous).
struct sembuf{
short sem_num;
/* numéro du sémaphore */
short sem_op;
/* opérations (+n, -n) */
short sem_flg;};
/* option (bloquant ou non) */
exemple:
struct sembuf TabOp[2] = {{0,1,0}, {1,-1, 0}};
indique que le sémaphore 0 doit être incrémenté
de 1 et que le sémaphore 1 doit être décrémenté
de 1.
semop(Num,
TabOP, 2);
réalise les 2 opérations de TabOp de
manière indivisible.
int semctl(int semid, int semnum, int
cmd, union semun {int val; struct semid_ds *buf; ushort *array;} arg):
Initialisation du sémaphore semnum
de l'ensemble semid ou supression de l'ensemble
de sémaphores (semun est une union
de types).
exemples:
semctl(Num, N, SETVAL, V);
initialise le sémaphore N du groupe
Num à la valeur V
semctl(Num,
0, IPC_RMID, 0); détruit
le groupe de sémaphores Num