La primitive
#include <sys/sem.h>
int semop(int dipc, struct sembuf *sops, unsigned int nsops);
est utilisée pour réaliser un tableau d'opérations de sémaphores sur un ensemble de sémaphores indiqué par dipc.
sops est un pointeur sur tableau de structures sembuf, et nsops indique le nombre d'éléments du tableau.
La structure sembuf
struct sembuf {
unsigned short int sem_num; /* # sémaphore */
short sem_op; /* opération du sémaphore */
short sem_flg; /* flags de l'opération */
};
Nature de l'opération dans la structure sembuf
Si sem_num > 0
une opération V est effectuée sur le sémaphore sem_num
Si sem_num < 0
une opération P est effectuée sur le sémaphore |sem_num|
Si sem_num == 0
c'est une opération d'attente qui se termine quand l'ensemble des sémaphores désignés par dipc sont à zéro.
La primitive
#include <sys/sem.h>
int semop (int dipc, struct sembuf *tab_op, int nb_op);
Les nb_op opérations placées à l'adresse tab_op sont réalisées atomiquement, c'est à dire toutes réalisées ou aucune !!
Le noyau gérant l'atomicité.
Si la i-ème opération ne peut être réalisée, les (i-1) premières sont annulées.
Chaque opération du tableau peut être rendue non bloquante.
Le fait d'avoir un appel bloquant on non bloquant va donc dépendre de l'ordre dans lequel on place les opérations à effectuer dans le tableau ...
Les cas d'échec