semop | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
NOM | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
SYNOPSIS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semop(int semid, struct sembuf *sops, unsigned nsops); int semtimedop(int semid, struct sembuf *sops, unsigned nsops, struct timespec *timeout);
Exigences de macros de test de fonctionalités pour la glibc (voir feature_test_macros(7)) :
DESCRIPTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
unsigned short semval; /* valeur du sémaphore */ unsigned short semzcnt; /* # Attente pour zéro */ unsigned short semncnt; /* # Attente d'incrément */ pid_t sempid; /* dernier processus agissant */semop() effectue des opérations sur les membres du jeu de sémaphores identifié par semid. Chacun des nsops éléments dans le tableau pointé par sops indique une opération à effectuer sur un seul sémaphore. Les éléments de cette structure sont du type struct sembuf, contenant les membres suivants :
unsigned 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 automatiquement annulée lorsque le processus se terminera.
L'ensemble des opérations contenues dans sops est effectué dans l'ordre et atomiquement. Les opérations sont soit toutes réalisées en même temps, soit pas du tout. Le comportement de l'appel système, si toutes les opérations ne sont pas réalisables, dépend de la présence de l'attribut IPC_NOWAIT dans les champs sem_flg décrits plus bas.
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 (semadj). 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, semop() é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 :
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, semop() é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 :
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 est fixé à l'heure actuelle.
semtimedop() se comporte comme semop() sauf que dans le cas où le processus doit dormir, la durée maximale du sommeil est limitée par la valeur spécifiée dans la structure timespec dont l'adresse est transmise dans le paramètre timeout. Si la limite indiquée a été atteinte, semtimedop() échoue avec errno contenant EAGAIN (et aucune opération de sops n'est réalisée). Si le paramètre timeout est NULL, alors semtimedop() se comporte exactement comme semop().
VALEUR RENVOYÉE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
ERREURS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
VERSIONS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
CONFORMITÉ | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
NOTES | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
semop() n'est jamais relancé automatiquement après avoir été interrompu par un gestionnaire de signal quelque soit l'attribut SA_RESTART durant l'installation du gestionnaire.
semadj est un entier pour le processus qui représente simplement le compte (négatif) des opérations sur le sémaphore réalisées par l'attribut SEM_UNDO. Quand la valeur d'un sémaphore est fixée directement par une requête SETVAL ou SETALL de semctl(2), la valeur semadj correspondante est effacée dans tous les processus.
Les valeurs semval, sempid, semzcnt, et semnct pour un sémaphore peuvent être retrouvées avec des appels semctl(2) spécifiques.
Les limites système suivantes concernent semop() :
L'implémentation n'a pas de limites intrinsèques pour la valeur maximale d'effacement en sortie (SEMAEM), le nombre de structure d'annulation sur le système (SEMMNU), et le nombre maximal de structures d'annulation pour un processus.
BOGUES | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Dans les noyaux 2.6.x, x <= 10, il y a un bogue qui, dans certaines circonstances, empêche un processus qui attend que la valeur d'un sémaphore passe à zéro de se réveiller lorsque cette valeur est actuellement zéro. ce bogue a été corrigé dans le noyau 2.6.11.
EXEMPLE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
struct sembuf sops[2]; int semid; /* Code to set semid omitted */ sops[0].sem_num = 0; /* Operate on semaphore 0 */ sops[0].sem_op = 0; /* Wait for value to equal 0 */ sops[0].sem_flg = 0; sops[1].sem_num = 0; /* Operate on semaphore 0 */ sops[1].sem_op = 1; /* Increment value by one */ sops[1].sem_flg = 0; if (semop(semid, &sop, 2) == -1) { perror("semop"); exit(EXIT_FAILURE); }
VOIR AUSSI | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
TRADUCTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 15 octobre 1996 et révisée le 6 juin 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 semop ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Sommaire | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
Table des mots clés | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
E2BIG | ERREURS |
EACCES | ERREURS |
EAGAIN | ERREURS |
EFAULT | ERREURS |
EFBIG | ERREURS |
EIDRM | ERREURS |
EINTR | ERREURS |
EINVAL | ERREURS |
ENOMEM | ERREURS |
ERANGE | ERREURS |
SEMOPM | NOTES |
SEMVMX | NOTES |