Sémaphores: mise en oeuvre sous UNIX
  • 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

suivant       plan