man semctl (Appels systèmes) - Opérations de contrôle sur les sémaphores.
NOM
semctl - Opérations de contrôle sur les sémaphores.
SYNOPSIS
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semctl (int semid, int semno, int cmd, ...);
DESCRIPTION
Cette fonction effectue l'opération de contrôle indiquée par cmd sur l'ensemble de sémaphores (ou sur le semno-ième sémaphore de l'ensemble) identifié par semid, (les sémaphores sont numérotés à partir de zéro).
Cette fonction prend trois ou quatre arguments. Lorsqu'il y en a quatre, l'appel est semctl(semid,semno,cmd,arg); où l'argument arg est de type union semun défini ainsi :
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) /* l'union semun est définie par l'inclusion de <sys/sem.h> */ #else /* d'après X/OPEN il faut la définir nous-mêmes */ union semun { int val; /* valeur pour SETVAL */ struct semid_ds *buf; /* buffer pour IPC_STAT, IPC_SET */ unsigned short *array; /* table pour GETALL, SETALL */ /* Spécificité Linux : */ struct seminfo *__buf; /* buffer pour IPC_INFO */ }; #endif
Les valeurs autorisées pour l'opération cmd sont :
- IPC_STAT
- copier dans la structure pointée par arg.buf la structure de données concernant l'ensemble de sémaphores. L'argument semno est alors ignoré. Le processus appelant doit avoir des privilèges de lecture sur le jeu de sémaphores
- IPC_SET
- Fixer la valeur de certains champs de la structure
semid_ds
pointée par
arg.buf
dans la structure de contrôle de l'ensemble de sémaphores, en mettant à jour
son membre
sem_ctime.
Les champs de la structure
struct semid_ds
fournie dans
arg.buf
et copiés dans la structure de l'ensemble sont :
sem_perm.uid sem_perm.gid sem_perm.mode /* 9 bits poids faibles*/
L'UID effectif du processus appelant doit être soit celui du Super-User soit celui du créateur ou du propriétaire du jeu de sémaphores. L'argument semno est ignoré. - IPC_RMID
- Supprimer immédiatement l'ensemble de sémaphores en réveillant tous les processus en attente. Ils obtiendront un code d'erreur, et errno aura la valeur EIDRM. L'UID effectif du processus appelant doit être soit celui du Super-User soit celui du créateur ou du propriétaire du jeu de sémaphores. L'argument semno est ignoré.
- GETALL
- Renvoyer la valeur semval de chaque sémaphore de l'ensemble dans le tableau arg.array. L'argument semno est ignoré. Le processus appelant doit avoir des privilèges de lecture sur le jeu de sémaphores.
- GETNCNT
- Renvoyer la valeur de semncnt pour le semno-ième sémaphore de l'ensemble (i.e. le nombre de processus en attente d'une incrémentation du champ semval du semno-ième sémaphore). Le processus appelant doit avoir des privilèges de lecture sur le jeu de sémaphores.
- GETPID
- Renvoyer la valeur de sempid pour le semno-ième sémaphore de l'ensemble (i.e. le PID du processus ayant exécute le dernier appel système semop sur le semno-ième sémaphore). Le processus appelant doit avoir des privilèges de lecture sur le jeu de sémaphores.
- GETVAL
- Renvoyer la valeur du champ semval du semno-ième sémaphore de l'ensemble Le processus appelant doit avoir des privilèges de lecture sur le jeu de sémaphores.
- GETZCNT
- Renvoyer la valeur du champ semzcnt du semno-ième sémaphore de l'ensemble. (i.e. le nombre de processus attendant que le champ semval du semno-ième sémaphore revienne à 0). Le processus appelant doit avoir des privilèges de lecture sur le jeu de sémaphores.
- SETALL
- Positionner le champ semval de tous les sémaphores de l'ensemble en utilisant le tableau arg.array et en mettant à jour le champ sem_ctime de la structure semid_ds de contrôle du jeu de sémaphores. Les processus en attente sont réveillés si semval devient 0 ou augmente. L'argument semno est ignoré. Le processus appelant doit avoir des privilèges d'écriture sur le jeu de sémaphores.
- SETVAL
- Placer la valeur arg.val dans le champ semval du semno-ième sémaphore de l'ensemble en mettant à jour le champ sem_ctime dans la structure semid_ds associée au jeu de sémaphores. Le processus appelant doit avoir des privilèges d'écriture sur le jeu de sémaphores Les processus en attente sont réveillés si semval devient 0 ou augmente.
VALEUR RENVOYÉE
En cas d'échec, l'appel-système renvoie -1 et errno contient le code d'erreur. Autrement, l'appel-système renvoie une valeur non-négative dépendant de l'argument cmd :
- GETNCNT
- la valeur de semncnt.
- GETPID
- La valeur sempid.
- GETVAL
- La valeur semval.
- GETZCNT
- La valeur semzcnt.
Toutes les autres commandes cmd renvoient zéro en cas de réussite.
ERREURS
EACCES Le processus appelant n'a pas les privilèges nécessaires pour exécuter la commande cmd.
- EFAULT
- arg.buf ou arg.array pointent en dehors de l'espace d'adressage accessible.
- EIDRM
- L'ensemble de sémaphores a été supprimé.
- EINVAL
- cmd ou semid a une valeur illégale.
- EPERM
- L'argument cmd réclame les commandes IPC_SET ou IPC_RMID mais l'UID effectif du processus appelant n'a pas les privilèges adéquats.
- ERANGE
- l'argument cmd réclame les commandes SETALL ou SETVAL et la valeur de semval (pour l'ensemble ou pour certains sémaphores) est inférieure à 0 ou supérieur à la valeur SEMVMX.
NOTES
Les appels-système IPC_INFO, SEM_STAT et SEM_INFO sont utilisés par le programme ipcs(8) pour fournir des informations sur les ressources allouées. Ceci peut changer dans le futur, en utilisant l'interface d'un système de fichiers proc.
Divers champs de la struct semid_ds étaient des shorts sous Linux 2.2 et sont devenus longs sous Linux 2.4. Pour en tirer parti, une recompilation sous GlibC 2.1.91 ou ultérieure doit suffire. (Le noyau distingue les anciens et nouveaux appels par un drapeau IPC_64 dans cmd.)
La limite suivante influe sur l'appel-système semctl :
- SEMVMX
- Valeur maximale pour semval dépendant de l'implémentation (généralement 32767).
Pour améliorer la portabilité, il vaut mieux invoquer toujours semctl avec quatre arguments. Sous Linux, la fonction semctl n'est pas un véritable appel-système, mais est implémentée au moyen de l'appel-système commun ipc(2).
CONFORMITÉ
SVr4, SVID. SVr4 documente des conditions d'erreurs supplémentaires EINVAL et EOVERFLOW.
VOIR AUSSI
TRADUCTION
Christophe Blaess, 1996-2003.