semctl(2) | System Calls Manual | semctl(2) |
semctl - Opérations de contrôle sur les sémaphores System V
Bibliothèque C standard (libc, -lc)
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...);
Cette fonction effectue l'opération de contrôle indiquée par cmd sur l'ensemble de sémaphores System V (ou sur le semnum-ième sémaphore de l'ensemble) identifié par semid. (Les sémaphores sont numérotés à partir de zéro.)
La fonction a trois ou quatre arguments, selon la valeur de cmd. Quand il y en a quatre, le quatrième est de type union semun. Le programme appelant doit définir cette union de la façon suivante :
union semun {
int val; /* Valeur pour SETVAL */
struct semid_ds *buf; /* Tampon pour IPC_STAT, IPC_SET */
unsigned short *array; /* Tableau pour GETALL, SETALL */
struct seminfo *__buf; /* Tampon pour IPC_INFO
(spécifique à Linux) */ };
La structure semid_ds est définie dans <sys/sem.h> comme suit :
struct semid_ds {
struct ipc_perm sem_perm; /* Permissions d'accès */
time_t sem_otime; /* Heure dernier semop() */
time_t sem_ctime; /* Heure de création/heure du */
dernier changement avec semctl() */
unsigned long sem_nsems; /* Nombre de sémaphores dans l'ensemble */ };
Les champs de la structure semid_ds sont les suivants :
La structure ipc_perm est définie de la façon suivante (les champs en gras peuvent être modifiés en utilisant IPC_SET) :
struct ipc_perm {
key_t __key; /* Clé fournie à semget(2) */
uid_t uid; /* UID effectif du propriétaire */
gid_t gid; /* GID effectif du propriétaire */
uid_t cuid; /* UID effectif du créateur */
gid_t cgid; /* GID effectif du créateur */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Numéro de séquence */ };
Les 9 bits les moins significatifs du champ mode de la structure ipc_perm définissent les droits d'accès aux segments de la mémoire partagée. Les bits de permission sont les suivants :
0400 | Lisible par l'utilisateur |
0200 | Droit d'écriture pour l'utilisateur |
0040 | Lisible par le groupe |
0020 | Autorisation d'écriture pour le groupe |
0004 | Lisible par les autres |
0002 | Écrit par d'autres |
En réalité, « écrire » signifie « modifier » pour un jeu de sémaphores. Les bits 0100, 0010 et 0001 (les bits d'exécution) ne sont pas utilisés par le système.
Les valeurs autorisées pour cmd sont :
struct seminfo {
int semmap; /* Nombre d'entrées dans la table de sémaphores ;
pas utilisé par le noyau */
int semmni; /* Nombre maximal d'ensembles de sémaphores */
int semmns; /* Nombre maximal de sémaphores dans tous les
ensembles de sémaphores */
int semmnu; /* Nombre maximal de structures « undo »
sur le système ; pas utilisé par le noyau */
int semmsl; /* Nombre maximal de sémaphores dans un ensemble */
int semopm; /* Nombre maximal d'opérations pour semop(2) */
int semume; /* Nombre maximal d'entrées « undo » par
processus ; pas utilisé par le noyau */
int semusz; /* Taille de struct sem_undo */
int semvmx; /* Valeur maximale d'un sémaphore */
int semaem; /* Valeur maximale pouvant être enregistrée pour
la mise à jour d'un sémaphore (SEM_UNDO) */ };
En cas de réussite, semctl() renvoie une valeur non négative dépendant de l'argument cmd :
Toutes les autres commandes cmd renvoient zéro en cas de réussite.
semctl() renvoie -1 s'il échoue auquel cas errno contient le code d'erreur.
POSIX.1-2001, POSIX.1-2008, SVr4.
POSIX.1 spécifie le champ sem_nsems de la structure semid_ds comme de type unsigned short, ce qui est suivi par de nombreux systèmes. Ce champ était défini ainsi dans Linux 2.2 et dans les versions précédentes. Depuis Linux 2.4, ce champ est de type unsigned long.
Les appels système IPC_INFO, SEM_STAT et SEM_INFO sont utilisés par le programme ipcs(1) pour fournir des informations sur les ressources allouées. Cela peut changer dans le futur, en utilisant l'interface d'un système de fichiers /proc.
Divers champs de la struct semid_ds étaient de type short sous Linux 2.2 et sont devenus de type long sous Linux 2.4. Pour en tirer parti, une recompilation sous la glibc 2.1.91 ou ultérieure doit suffire. (Le noyau distingue les anciens et nouveaux appels par un drapeau IPC_64 dans cmd.)
Dans certaines versions antérieures de la glibc, l'union semun était définie dans <sys/sem.h>, mais POSIX.1 documente que l'appelant doit définir cette union. Dans les versions de la glibc où cette union n'est pas définie, la macro _SEM_SEMUN_UNDEFINED est définie dans <sys/sem.h>.
La limite suivante du système sur les jeux de sémaphore affecte l'appel système semctl() :
Pour améliorer la portabilité, il vaut mieux invoquer toujours semctl() avec quatre arguments.
POSIX.1 définit sempid comme l'« ID du processus de la dernière opération » sur un sémaphore, et note explicitement que cette valeur est réglée par un appel semop réussi, avec l'implication qu'aucune autre interface n'affecte la valeur sempid.
Bien que certaines implémentations respectent le comportement défini dans POSIX.1, d'autres ne le font pas (le tort revient ici probablement à POSIX.1 qui n'a pas réussi à englober tous les comportements implémentés existants). Diverses autres implémentations mettent également à jour sempid pour d'autres opérations qui mettent à jour la valeur d'un sémaphore : les opérations SETVAL et SETALL, ainsi que les ajustements de sémaphores exécutés en fin de processus du fait de l'utilisation de l'option SEM_UNDO (voir semop(2)).
Linux modifie également sempid pour les opérations SETVAL et les ajustements de sémaphores. Cependant, de façon plutôt incohérente, le noyau ne mettait pas à jour sempid pour les opérations SETALL jusqu'à la version 4.5 de Linux incluse. Cela a été corrigé avec la version 4.6.
Consultez shmop(2).
ipc(2), semget(2), semop(2), capabilities(7), sem_overview(7), sysvipc(7)
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Thomas Vincent <tvincent@debian.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.
15 décembre 2022 | Pages du manuel de Linux 6.03 |