Man page - msgop(2)

Packages contains this manual

Available languages:

en fr pl ja ru

Manual

MSGOP

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
msgsnd()
msgrcv()
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
BOGUES
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

msgrcv, msgsnd - Opérations sur les files de messages System V

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <sys/msg.h>

int msgsnd(int msqid , const void msgp [. msgsz ], size_t msgsz ,
int
msgflg );

ssize_t msgrcv(int msqid , void msgp [. msgsz ], size_t msgsz , long msgtyp ,
int
msgflg );

DESCRIPTION

Les appels systĂšme msgsnd () et msgrcv () servent respectivement Ă  envoyer et Ă  recevoir des messages d’une file de messages System V. Le processus appelant doit avoir une permission d’écriture sur la file pour envoyer un message, et une permission de lecture pour en recevoir un.

L’argument msgp est un pointeur vers une structure dĂ©finie par l’appelant de la forme gĂ©nĂ©rale suivante :

struct msgbuf {
long mtype; /* type de message, doit ĂȘtre > 0 */
char mtext[1]; /* contenu du message */
};

Le champ mtext est un tableau (ou une autre structure) de taille msgsz , valeur entiĂšre positive ou nulle. Les messages de taille nulle (sans champ mtext ) sont autorisĂ©s. Le membre mtype doit avoir une valeur strictement positive qui puisse ĂȘtre utilisĂ©e par le processus lecteur pour la sĂ©lection de messages (voir la description de msgrcv () ci-dessous).

msgsnd()

L’appel systĂšme msgsnd () insĂšre une copie du message pointĂ© par l’argument msgp dans la file dont l’identifiant est indiquĂ© par la valeur de l’argument msqid .

S’il y a assez de place dans la file, msgsnd () rĂ©ussit immĂ©diatement. La capacitĂ© de la file est rĂ©gie par le champ msg_qbytes de la structure associĂ©e Ă  la file de messages. Durant la crĂ©ation de la file, ce champ est initialisĂ© Ă  MSGMNB octets, mais cette limite peut ĂȘtre modifiĂ©e avec msgctl (2). Une file de message est considĂ©rĂ©e pleine si une de ces conditions est remplie :

-

AprĂšs l’ajout d’un message Ă  la file, le nombre total d’octets dans la file aurait dĂ©passĂ© la taille maximale de la file (champ msg_qbytes ).

-

AprĂšs l’ajout d’un message Ă  la file, le nombre total de messages dans la file aurait dĂ©passĂ© la taille maximale de la file (champ msg_qbytes ).Cette vĂ©rification permet d’éviter qu’un nombre illimitĂ© de messages de taille nulle soit ajoutĂ© Ă  la file. Bien que tels messages ne contiennent pas de donnĂ©es, ils consomment nĂ©anmoins de la mĂ©moire du noyau, sujette Ă  un verrou.

S’il n’y a pas assez de place, alors le comportement par dĂ©faut de msgsnd () est de bloquer jusqu’à obtenir suffisamment d’espace. En indiquant IPC_NOWAIT dans l’argument msgflg , le message ne sera pas envoyĂ© et l’appel systĂšme Ă©chouera en retournant EAGAIN dans errno .

Un appel à msgsnd () bloqué peut échouer si :

-

la file est supprimĂ©e, auquel cas l’appel systĂšme Ă©choue avec errno valant EIDRM ; ou

-

un signal a Ă©tĂ© interceptĂ©, auquel cas l’appel systĂšme Ă©choue avec errno valant EINTR ; consultez signal (7). ( msgsnd () n’est jamais relancĂ© automatiquement aprĂšs interruption par un gestionnaire de signal, quelle que soit la configuration de SA_RESTART lors de l’installation du gestionnaire.)

Si l’appel systĂšme rĂ©ussit, la structure dĂ©crivant la file de messages est mise Ă  jour comme suit.

-

msg_lspid contient le PID du processus appelant.

-

msg_qnum est incrémenté de 1 .

-

msg_stime est rempli avec l’heure actuelle.

msgrcv()

L’appel systĂšme msgrcv () supprime un message depuis la file indiquĂ©e par msqid et le place dans le tampon pointĂ© par msgp .

L’argument msgsz indique la taille maximale en octets du membre mtext de la structure pointĂ©e par l’argument msgp . Si le contenu du message est plus long que msgsz octets, le comportement dĂ©pend de la prĂ©sence ou non de MSG_NOERROR dans msgflg . Si MSG_NOERROR est spĂ©cifiĂ©, alors le message sera tronquĂ© (et la partie tronquĂ©e sera perdue) ; si MSG_NOERROR n’est pas spĂ©cifiĂ©, le message ne sera pas extrait de la file, et l’appel systĂšme Ă©chouera en renvoyant -1 et en indiquant E2BIG dans errno .

À moins que MSG_COPY ne soit indiquĂ© dans msgflg (voir ci-dessous), l’argument msgtyp indique le type de message dĂ©sirĂ©.

-

Si msgtyp vaut 0 , le premier message est lu.

-

Si msgtyp est supĂ©rieur Ă  0 , alors le premier message de type msgtyp est extrait de la file. Si msgflg contient MSG_EXCEPT l’inverse est effectuĂ©, le premier message de type diffĂ©rent de msgtyp est extrait de la file.

-

Si msgtyp est inférieur à 0 , le premier message de la file avec un type le plus proche inférieur ou égal à la valeur absolue de msgtyp est extrait.

L’argument msgflg est composĂ© d’un OU binaire « | » avec les attributs suivants.
IPC_NOWAIT

S’arrĂȘter immĂ©diatement si aucun message du type dĂ©sirĂ© n’est prĂ©sent dans la file. L’appel systĂšme Ă©choue et errno est configurĂ© Ă  ENOMSG .

MSG_COPY (depuis Linux 3.8)

Récupérer une copie de façon non destructive du message dans la file à la position ordinale indiquée par msgtyp (les messages sont considérées numérotés à partir de 0 ).

Cet attribut doit ĂȘtre indiquĂ© en conjonction avec IPC_NOWAIT , de telle sorte que si aucun message n’est disponible Ă  la position donnĂ©e, l’appel Ă©choue immĂ©diatement avec l’erreur ENOMSG . Parce qu’ils modifient le sens de msgtyp de maniĂšre opposĂ©e, MSG_COPY et MSG_EXCEPT ne peuvent ĂȘtre dĂ©finis simultanĂ©ment dans msgflg .

L’attribut MSG_COPY a Ă©tĂ© ajoutĂ© pour l’implĂ©mentation du point de restauration du noyau et n’est disponible que si le noyau a Ă©tĂ© compilĂ© avec l’option CONFIG_CHECKPOINT_RESTORE .

MSG_EXCEPT

Utilisé avec msgtyp supérieur à 0 pour lire les messages de type différent de msgtyp .

MSG_NOERROR

Tronquer silencieusement les messages plus longs que msgsz octets.

Si aucun message du type requis n’est disponible et si on n’a pas demandĂ© IPC_NOWAIT dans msgflg , le processus appelant est bloquĂ© jusqu’à l’occurrence d’un des Ă©vĂ©nements suivants:

-

Un message du type désiré arrive dans la file.

-

La file de messages est supprimĂ©e. L’appel systĂšme Ă©choue et errno contient EIDRM .

-

Le processus appelant intercepte un signal. Dans ce cas l’appel systĂšme Ă©choue avec errno valant EINTR . ( msgrcv () n’est jamais relancĂ© automatiquement aprĂšs interruption par un gestionnaire de signal, quelle que soit la configuration de SA_RESTART lors de l’installation du gestionnaire.)

Si l’appel systĂšme rĂ©ussit, la structure dĂ©crivant la file de messages est mise Ă  jour comme suit.

msg_lrpid est rempli avec le PID du processus appelant.

msg_qnum est décrémenté de 1 .

msg_rtime est rempli avec l’heure actuelle.

VALEUR RENVOYÉE

En cas de succĂšs, msgsnd () renvoie 0 et msgrcv () renvoie le nombre d’octets vraiment copiĂ©s dans la table mtext . En cas d’échec les deux appels systĂšme renvoient -1 et dĂ©finissent errno pour indiquer l’erreur.

ERREURS

msgsnd () peut échouer avec les valeurs suivantes :

EACCES

Le processus appelant n’a pas de permission de lecture dans la file et n’a pas la capacitĂ© CAP_IPC_OWNER dans l’espace de noms qui gĂšre son espace de noms IPC.

EAGAIN

Le message n’a pas pu ĂȘtre envoyĂ© Ă  cause de la limite msg_qbytes pour la file et de la requĂȘte IPC_NOWAIT dans msgflg .

EFAULT

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

EIDRM

La file de messages a été supprimée.

EINTR

Un signal est arrivĂ© avant d’avoir pu Ă©crire quoi que ce soit.

EINVAL

msqid est n’est pas valable, ou bien mtype n’est pas positif, ou bien msgsz est non valable (nĂ©gatif ou supĂ©rieur Ă  la valeur MSGMAX du systĂšme).

ENOMEM

Le systĂšme n’a pas assez de mĂ©moire pour copier le message pointĂ© par msgp .

msgrcv () peut échouer avec les valeurs suivantes :

E2BIG

Le message est plus long que msgsz , et MSG_NOERROR n’a pas Ă©tĂ© indiquĂ© dans msgflg .

EACCES

Le processus appelant n’a pas de permission de lecture dans la file et n’a pas la capacitĂ© CAP_IPC_OWNER dans l’espace de noms qui gĂšre son espace de noms IPC.

EFAULT

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

EIDRM

La file de messages a été supprimée alors que le processus attendait un message.

EINTR

Un signal est arrivĂ© avant d’avoir pu lire quoi que ce soit ; consultez signal (7).

EINVAL

msgqid n’était pas valable ou msgsz valait moins de 0 .

EINVAL (depuis Linux 3.14)

msgflg définit MSG_COPY sans définir IPC_NOWAIT .

EINVAL (depuis Linux 3.14)

msgflg définit à la fois MSG_COPY et MSG_EXCEPT .

ENOMSG

IPC_NOWAIT a Ă©tĂ© indiquĂ© dans msgflg et aucun message du type rĂ©clamĂ© n’existe dans la file.

ENOMSG

IPC_NOWAIT et MSG_COPY ont été indiqués dans msgflg et la file contient moins de msgtyp messages.

ENOSYS (depuis Linux 3.8)

MSG_COPY et IPC_NOWAIT ont été indiqués dans msgflg et le noyau a été configuré sans CONFIG_CHECKPOINT_RESTORE .

STANDARDS

POSIX.1-2008.

Les attributs MSG_EXCEPT et MSG_COPY sont spĂ©cifiques Ă  Linux. Leur dĂ©finition peut ĂȘtre obtenue en dĂ©finissant la macro de test de fonctionnalitĂ©s _GNU_SOURCE .

HISTORIQUE

POSIX.1-2001, SVr4.

L’argument msgp est dĂ©clarĂ© comme un struct msgbuf * avec les bibliothĂšques glibc 2.0 et glibc 2.1. Il est dĂ©clarĂ© comme un void * avec la bibliothĂšque glibc 2.2, suivant ainsi les spĂ©cifications SUSv2 et SUSv3.

NOTES

Les limites suivantes concernent les files de messages et affectent l’appel msgsnd ().

MSGMAX

Taille maximale d’un message texte, en octets (valeur par dĂ©faut : 8192 octets). Sous Linux, cette limite peut ĂȘtre lue et modifiĂ©e grĂące au fichier /proc/sys/kernel/msgmax ).

MSGMNB

Nombre maximal d’octets d’une file de messages (valeur par dĂ©faut : 16384 octets. Sous Linux, elle peut ĂȘtre lue et modifiĂ©e grĂące au fichier /proc/sys/kernel/msgmnb ). Un processus privilĂ©giĂ© (sous Linux : avec la capacitĂ© CAP_SYS_RESOURCE ) peut augmenter la taille d’une file de messages au-delĂ  de MSGMNB en utilisant l’opĂ©ration IPC_SET de msgctl (2).

L’implĂ©mentation des files de messages sous Linux n’a pas de limites systĂšme intrinsĂšques ni pour le nombre d’en-tĂȘtes de messages ( MSGTQL ) ni pour la taille, en octets, de l’ensemble de tous les messages ( MSGPOOL ).

BOGUES

Jusqu’à la version Linux 3.13, si msgrcv () Ă©tait appelĂ© avec l’attribut MSG_COPY , mais sans IPC_NOWAIT , et que la file de messages contenait moins de msgtyp messages, alors l’appel bloquait jusqu’à ce que le message suivant soit Ă©crit dans la file. À ce moment lĂ , l’appel renvoyait une copie du message, quelle que soit la position ordinale msgtyp de ce message. Ce bogue est corrigĂ© depuis Linux 3.14.

Indiquer Ă  la fois MSG_COPY et MSC_EXCEPT dans msgflg est une erreur de logique (puisque ces attributs imposent des interprĂ©tations diffĂ©rentes de msgtyp ). Jusqu’à Linux 3.13, cette erreur n’était pas diagnostiquĂ©e par msgsrv (). Ce bogue est corrigĂ© depuis Linux 3.14.

EXEMPLES

Le programme ci-dessous montre l’utilisation de msgsnd () et de msgrcv ().

Le programme d’exemple est d’abord exĂ©cutĂ© avec l’option -s pour envoyer un message, puis rĂ©exĂ©cutĂ© avec l’option -r pour recevoir un message.

La session d’interprĂ©teur suivant montre un Ă©chantillon d’exĂ©cution du programme :

$ ./a.out -s
envoi : un message le mercredi 4 mars 2015 Ă  16:25:45

$ ./a.out -r
message reçu : un message le mercredi 4 mars 2015 à 16:25:45

Source du programme

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <time.h>
#include <unistd.h>
struct msgbuf {
long mtype;
char mtext[80];
};
static void
usage(char *prog_name, char *msg)
{
if (msg != NULL)
fputs(msg, stderr);
fprintf(stderr, "Utilisation : %s [options]\n", prog_name);
fprintf(stderr, "Les options sont :\n");
fprintf(stderr, "-s envoyer un message en utilisant msgsnd()\n");
fprintf(stderr, "-r lire un message en utilisant msgrcv()\n");
fprintf(stderr, "-t type de message (1 par défaut)\n");
fprintf(stderr, "-k clé de mise en attente du message (1234 par défaut)\n");
exit(EXIT_FAILURE);
}
static void
send_msg(int qid, int msgtype)
{
time_t t;0
struct msgbuf msg;
msg.mtype = msgtype;
time(&t);
snprintf(msg.mtext, sizeof(msg.mtext), "a message at %s",
ctime(&t));
if (msgsnd(qid, &msg, sizeof(msg.mtext),
IPC_NOWAIT) == -1)
{
perror("msgsnd error");
exit(EXIT_FAILURE);
}
printf("envoyé : %s\n", msg.mtext);
}
static void
get_msg(int qid, int msgtype)
{
struct msgbuf msg;
if (msgrcv(qid, &msg, sizeof(msg.mtext), msgtype,
MSG_NOERROR | IPC_NOWAIT) == -1) {
if (errno != ENOMSG) {
perror(
exit(EXIT_FAILURE);
}
printf("Aucun message disponible pour msgrcv()\n");
} else {
printf("message reçu : %s\n", msg.mtext);
}
}
int
main(int argc, char *argv[])
{
int qid, opt;
int mode = 0; /* 1 = send, 2 = receive */0
int msgtype = 1;
int msgkey = 1234;
while ((opt = getopt(argc, argv, "srt:k:")) != -1) {
switch (opt) {
case 's':
mode = 1;
break;
case 'r':
mode = 2;
break;
case 't':
msgtype = atoi(optarg);
if (msgtype <= 0)
usage(argv[0],
break;
case 'k':
msgkey = atoi(optarg);
break;
default:
usage(argv[0], "Option non reconnue\n");
}
}
if (mode == 0)
usage(argv[0], "doit ĂȘtre l’option -s ou -r\n");
qid = msgget(msgkey, IPC_CREAT | 0666);
if (qid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
if (mode == 2)
get_msg(qid, msgtype);
else
send_msg(qid, msgtype);
exit(EXIT_SUCCESS);
}

VOIR AUSSI

msgctl (2), msgget (2), capabilities (7), mq_overview (7), sysvipc (7)

TRADUCTION

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> et Jean-Philippe MENGUAL <jpmengual@debian.org>

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 .