Linux

CentOS 4.8

semop(2)


SEMOP

NOM

semop − Opérations sur les sémaphores.

SYNOPSIS

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semop (int semid, struct sembuf *sops, unsigned nsops);

DESCRIPTION

Cette fonction effectue des opérations sur les membres sélectionnés de l’ensemble de sémaphores identifié par semid. Chacun des nsops éléments dans le tableau pointé par sops indique une opération à effectuer sur un sémaphore en utilisant une structure struct sembuf définie comme suit:

  short sem_num;  /* Numéro du sémaphore (0=premier) */
  short sem_op;   /* Opération sur le sémaphore      */
  short sem_flg;  /* Options pour l’opération        */

Les options possibles pour sem_flg sont IPC_NOWAIT et SEM_UNDO. Si une opération indique l’option SEM_UNDO, elle sera annulée lorsque le processus se terminera.

La sémantique de cet appel système assure qu’un appel système ne sera effectué que si toutes ses opérations réussissent. Chaque opération est effectuée sur le sem_num−ième sémaphore de l’ensemble. Le premier sémaphore est le numéro 0 . Pour chaque sémaphore l’opération est l’une des trois décrites ci-dessous.

Si l’argument sem_op est un entier positif, la fonction ajoute cette valeur à semval. De plus si SEM_UNDO est demandé, le système met à jour le compteur "undo" du sémaphore. Cette opération n’est jamais bloquante. Le processus appelant doit avoir l’autorisation de modification sur le jeu de sémaphores.

Si sem_op vaut zéro le processus attend que semval soit nul. Plusieurs cas sont possibles :

Si semval vaut zéro, l’appel système continue immédiatement

Sinon, si l’on a réclamé IPC_NOWAIT dans sem_flg, l’appel système échoue (en annulant les actions précédentes) et errno contient le code d’erreur EAGAIN.

Autrement semzcnt est incrémenté de 1 et le processus s’endort jusqu’à ce que l’un des évènements suivants se produise :

semval devient égal à 0, alors semzcnt est décrémenté. L’appel système continue

Le jeu de sémaphores est supprimé. L’appel système échoue et errno contient le code d’erreur EIDRM.

Le processus reçoit un signal à intercepter, la valeur de semzcnt est décrémentée et l’appel système échoue avec errno contenant le code d’erreur EINTR.

Le processus appelant doit avoir l’autorisation de lecture sur le jeu de sémaphores.

Si sem_op est inférieur à zéro, le processus appelant doit avoir l’autorisation de modification sur le jeu de sémaphores.

Si semval est supérieur ou égal à la valeur absolue de sem_op, la valeur absolue de sem_op est soustraite de semval. Si SEM_UNDO est indiqué, le système met à jour le compteur "undo" du sémaphore. Puis l’appel système continue. Autrement si l’on a réclamé IPC_NOWAIT dans sem_flg, l’appel système échoue (annulant les actions précédentes et errno contient le code d’erreur EAGAIN. Sinon semncnt est décrémenté de un et le processus s’endort jusqu’à ce que l’un des évènements suivants se produise :

semval devient supérieur ou égal à la valeur absolue de sem_op, alors la valeur semncnt est décrémentée, la valeur absolue de sem_op est soustraite de semval et si SEM_UNDO est demandé le système met à jour le compteur "undo" du sémaphore. Puis l’appel système continue.

Le jeu de sémaphores est supprimé. L’appel système échoue et errno contient le code d’erreur EIDRM.

Le processus reçoit un signal à intercepter, la valeur de semncnt est décrémentée et l’appel système échoue avec errno contenant le code d’erreur EINTR.

en cas de succès, le membre sempid de la structure sem de chacun des sémaphores indiqués dans le tableau pointé par sops est rempli avec le PID du processus appelant. Enfin sem_otime et sem_ctime sont fixés à l’heure actuelle.

VALEUR RENVOYÃE

renvoie la valeur 0, s’il réussit et −1 s’il échoue auquel cas errno contient le code d’erreur.

ERREURS

E2BIG

l’argument nsops est supérieur à SEMOPM, le nombre maximal d’opérations par appel système.

EACCES

Le processus appelant n’a pas les permissions d’accès nécessaires.

EAGAIN

Une opération a échoué et IPC_NOWAIT a été indiqué dans l’argument sem_flg.

EFAULT

sops pointe en dehors de l’espace d’adressage accessible.

EFBIG

La valeur de sem_num est inférieure à 0 ou supérieure ou égale au nombre de sémaphores dans l’ensemble.

EIDRM

Le jeu de sémaphores a été supprimé.

EINTR

Un signal a été reçu pendant l’attente.

EINVAL

L’ensemble de sémaphores n’existe pas ou semid est inférieur à zéro, ou nsops n’a pas une valeur positive.

ENOMEM

Pas assez de mémoire pour allouer les structures nécessaires.

ERANGE

semop + semval est supérieur à SEMVMX.

NOTES

Les structures sem_undo d’un processus ne sont pas héritées par ses enfants lors d’un fork(2). par contre elles sont transmises lors d’un execve(2).

Les limites système suivantes concernent semop :

SEMOPM

Nombre maximal d’opérations pour un appel système semop .

SEMVMX

Valeur maximale pour semval.

BOGUES

Le système maintient une structure sem_undo par processus pour chaque sémaphore modifié par le processus avec une requête "undo". Ces structures sont libérées à la sortie du processus. Le problème principal avec le mécanisme undo est qu’il viole le principe d’un jeu d’opérations élémentaires sur les sémaphores. La requête "undo" nécessite une table et chaque sémaphore peut avoir participé à de nombreux appels semopt. Le processus doit-il s’endormir en se terminant ou doit-il appliquer les opérations undo avec un comportement IPC_NOWAIT ? Actuellement les opérations "undo" qui réussissent immédiatement sont appliquées, et les autres sont ignorées silencieusement. Il vaut donc mieux n’utiliser les requêtes undo que dans le cas d’ensembles de sémaphores privés.

CONFORMITÃ

SVr4, SVID. SVr4 documente les conditions d’erreur supplémentaires EINVAL, EFBIG, et ENOSPC.

VOIR AUSSI

ipc(5), semctl(2), semget(2).

TRADUCTION

Christophe Blaess, 1997.


semop(2)