msgctl()
permet d'effectuer l'opération indiquée par
cmd
sur la file de messages ayant l'identificateur
msqid.
La structure de données
msqid_ds
est définie dans
<sys/msg.h>
de la manière suivante :
struct msqid_ds {
struct ipc_perm msg_perm; /* Appartenance et permissions */
time_t msg_stime; /* Heure du dernier msgsnd(2) */
time_t msg_rtime; /* Heure du dernier msgrcv(2) */
time_t msg_ctime; /* Heure de la dernière modif */
unsigned long __msg_cbytes; /* Nombre actuel d'octets dans la
file (non-standard) */
msgqnum_t msg_qnum; /* Nombre actuel de messages dans
la file */
msglen_t msg_qbytes; /* Nombre maximum d'octets
autorisés dans la file */
pid_t msg_lspid; /* PID du dernier msgsnd(2) */
pid_t msg_lrpid; /* PID du dernier msgrcv(2) */
};
La structure
ipc_perm
est définie dans
<sys/ipc.h>
de la manière suivante
(les champs mis en évidence sont configurables en utilisant
IPC_SET):
struct ipc_perm {
key_t key; /* Clé fournie à msgget(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 valeurs possibles de
cmd
sont :
-
- IPC_STAT
-
Copier les informations depuis la structure de données du noyau associée à
msqid
dans la structure
msqid_ds
pointée par
buf.
L'appelant doit avoir des privilèges d'accès en lecture sur
la file de messages.
-
- IPC_SET
-
Écrire la valeur de certains champs de la structure
msqid_ds
pointée par
buf
dans la structure de données du noyau associée à cette file de messages,
en mettant à jour le champ
msg_ctime.
Les champs suivants de la structure peuvent être mis à jour :
msg_qbytes,
msg_perm.uid,
msg_perm.gid
et (les 9 bits poids faibles de)
msg_perm.mode.
L'UID effectif du processus appelant doit être celui du propriétaire
(msg_perm.uid)
ou celui du créateur
(msg_perm.cuid)
de la file de messages ou l'appelant doit être privilégié.
Des privilèges appropriés (sous Linux, la capacité
CAP_IPC_RESOURCE)
sont nécessaires pour augmenter la valeur de
msg_qbytes
au-dessus de la constante système
MSGMNB.
Sur un système Linux, cela nécessite la capacité
CAP_SYS_RESOURCE.
-
- IPC_RMID
-
Effacer immédiatement la file de messages, en réveillant
tous les processus écrivains et lecteurs en attente.
Ils obtiendront un code d'erreur, et
errno
aura la valeur
EIDRM.
Le processus appelant doit avoir les privilèges associés ou bien son UID
effectif doit être celui du créateur ou du propriétaire
de la file de messages.
-
- IPC_INFO (Spécifique à Linux)
-
Renvoyer les informations sur les limites de files de messages à l'échelle
du système et les paramètres dans une structure pointée par
buf.
Cette structure est du type
msginfo
(aussi, un transtypage est nécessaire),
définie dans
<sys/msg.h>
si la macro de test de fonctionnalités
_GNU_SOURCE
est définie :
struct msginfo {
int msgpool; /* Taille en kibioctets du tampon utilisé pour
stocker les données messages ;
inutilisé dans le noyau */
int msgmap; /* Nombre maximum d'entrées dans la carte de
messages ; inutilisé dans le noyau */
int msgmax; /* Nombre maximum d'octets qui peuvent
être écrit dans un message */
int msgmnb; /* Nombre maximum d'octets qui peuvent être écrits
dans une file ; utilisé pour initialiser
msg_qbytes lors de la création de la file
(msgget(2)) */
int msgmni; /* Nombre maximum de files de messages */
int msgssz; /* Taille du segment de message ;
inutilisé dans le noyau */
int msgtql; /* Nombre maximum de messages dans toutes les files
du système ; inutilisé dans le noyau */
unsigned short int msgseg;
/* Nombre maximum de segments ;
inutilisé dans le noyau */
};
Les réglages
msgmni,
msgmax
et
msgmnb
peuvent être modifié via les fichiers
/proc
de même nom ; voir
proc(5)
pour plus de détails.
-
- MSG_INFO (Spécifique à Linux)
-
Renvoie une structure
msginfo
contenant les mêmes informations que pour
IPC_INFO,
excepté que les champs suivants sont renvoyés avec une information
relative aux ressources système consommées par les files de messages :
le champ
msgpool
renvoie le nombre de files de messages qui existent actuellement sur le
système ; le champ
msgmap
renvoie le nombre total de messages dans toutes les files du système ;
et le champ
msgtql
renvoie le nombre total d'octets de tous les messages de toutes les files
du système.
-
- MSG_STAT (Spécifique à Linux)
-
Renvoie une structure
msqid_ds
comme pour
IPC_STAT.
Toutefois, l'argument
msqid
n'est pas un identifiacateur de file, mais plutôt un index dans un tableau
interne au noyau qui contient des informations sur toutes les files de
messages sur le système.