1MSGOP(2)                   Linux Programmer's Manual                  MSGOP(2)
2
3
4

NAME

6       msgrcv, msgsnd - System V message queue operations
7

SYNOPSIS

9       #include <sys/msg.h>
10
11       int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
12
13       ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
14                      int msgflg);
15

DESCRIPTION

17       The  msgsnd()  and  msgrcv() system calls are used to send messages to,
18       and receive messages from,  a  System V  message  queue.   The  calling
19       process  must  have  write  permission on the message queue in order to
20       send a message, and read permission to receive a message.
21
22       The msgp argument is a pointer to a  caller-defined  structure  of  the
23       following general form:
24
25           struct msgbuf {
26               long mtype;       /* message type, must be > 0 */
27               char mtext[1];    /* message data */
28           };
29
30       The  mtext  field is an array (or other structure) whose size is speci‐
31       fied by msgsz, a nonnegative integer value.  Messages  of  zero  length
32       (i.e.,  no  mtext  field)  are  permitted.  The mtype field must have a
33       strictly positive integer value.  This value can be used by the receiv‐
34       ing  process for message selection (see the description of msgrcv() be‐
35       low).
36
37   msgsnd()
38       The msgsnd() system call appends a copy of the message  pointed  to  by
39       msgp to the message queue whose identifier is specified by msqid.
40
41       If  sufficient space is available in the queue, msgsnd() succeeds imme‐
42       diately.  The queue capacity is governed by the msg_qbytes field in the
43       associated data structure for the message queue.  During queue creation
44       this field is initialized to MSGMNB bytes, but this limit can be  modi‐
45       fied  using msgctl(2).  A message queue is considered to be full if ei‐
46       ther of the following conditions is true:
47
48       • Adding a new message to the queue would cause  the  total  number  of
49         bytes in the queue to exceed the queue's maximum size (the msg_qbytes
50         field).
51
52       • Adding another message to the queue would cause the total  number  of
53         messages  in  the  queue  to  exceed  the  queue's  maximum size (the
54         msg_qbytes field).  This check is necessary to prevent  an  unlimited
55         number  of  zero-length messages being placed on the queue.  Although
56         such messages contain no data,  they  nevertheless  consume  (locked)
57         kernel memory.
58
59       If  insufficient  space is available in the queue, then the default be‐
60       havior of msgsnd() is to  block  until  space  becomes  available.   If
61       IPC_NOWAIT is specified in msgflg, then the call instead fails with the
62       error EAGAIN.
63
64       A blocked msgsnd() call may also fail if:
65
66       • the queue is removed, in which case the system call fails with  errno
67         set to EIDRM; or
68
69       • a  signal  is  caught, in which case the system call fails with errno
70         set  to  EINTR;see  signal(7).   (msgsnd()  is  never   automatically
71         restarted  after being interrupted by a signal handler, regardless of
72         the setting of the SA_RESTART flag when establishing  a  signal  han‐
73         dler.)
74
75       Upon  successful completion the message queue data structure is updated
76       as follows:
77
78msg_lspid is set to the process ID of the calling process.
79
80msg_qnum is incremented by 1.
81
82msg_stime is set to the current time.
83
84   msgrcv()
85       The msgrcv() system call removes a message from the queue specified  by
86       msqid and places it in the buffer pointed to by msgp.
87
88       The  argument  msgsz specifies the maximum size in bytes for the member
89       mtext of the structure pointed to by the msgp argument.  If the message
90       text  has  length  greater  than  msgsz,  then  the behavior depends on
91       whether MSG_NOERROR is specified in msgflg.  If MSG_NOERROR  is  speci‐
92       fied,  then  the message text will be truncated (and the truncated part
93       will be lost); if MSG_NOERROR is not specified, then the message  isn't
94       removed  from the queue and the system call fails returning -1 with er‐
95       rno set to E2BIG.
96
97       Unless MSG_COPY is specified in msgflg (see below), the msgtyp argument
98       specifies the type of message requested, as follows:
99
100       • If msgtyp is 0, then the first message in the queue is read.
101
102       • If  msgtyp  is greater than 0, then the first message in the queue of
103         type msgtyp is read, unless MSG_EXCEPT was specified  in  msgflg,  in
104         which case the first message in the queue of type not equal to msgtyp
105         will be read.
106
107       • If msgtyp is less than 0, then the first message in  the  queue  with
108         the  lowest  type  less than or equal to the absolute value of msgtyp
109         will be read.
110
111       The msgflg argument is a bit mask constructed by ORing together zero or
112       more of the following flags:
113
114       IPC_NOWAIT
115              Return immediately if no message of the requested type is in the
116              queue.  The system call fails with errno set to ENOMSG.
117
118       MSG_COPY (since Linux 3.8)
119              Nondestructively fetch a copy of the message at the ordinal  po‐
120              sition in the queue specified by msgtyp (messages are considered
121              to be numbered starting at 0).
122
123              This flag must be specified in conjunction with IPC_NOWAIT, with
124              the  result  that, if there is no message available at the given
125              position, the call fails immediately with the error ENOMSG.  Be‐
126              cause  they  alter  the  meaning  of  msgtyp in orthogonal ways,
127              MSG_COPY and MSG_EXCEPT may not both be specified in msgflg.
128
129              The MSG_COPY flag was added for the implementation of the kernel
130              checkpoint-restore  facility and is available only if the kernel
131              was built with the CONFIG_CHECKPOINT_RESTORE option.
132
133       MSG_EXCEPT
134              Used with msgtyp greater than 0 to read the first message in the
135              queue with message type that differs from msgtyp.
136
137       MSG_NOERROR
138              To truncate the message text if longer than msgsz bytes.
139
140       If  no  message of the requested type is available and IPC_NOWAIT isn't
141       specified in msgflg, the calling process is blocked until  one  of  the
142       following conditions occurs:
143
144       • A message of the desired type is placed in the queue.
145
146       • The message queue is removed from the system.  In this case, the sys‐
147         tem call fails with errno set to EIDRM.
148
149       • The calling process catches a signal.  In this case, the system  call
150         fails  with  errno  set  to  EINTR.  (msgrcv() is never automatically
151         restarted after being interrupted by a signal handler, regardless  of
152         the  setting  of  the SA_RESTART flag when establishing a signal han‐
153         dler.)
154
155       Upon successful completion the message queue data structure is  updated
156       as follows:
157
158              msg_lrpid is set to the process ID of the calling process.
159
160              msg_qnum is decremented by 1.
161
162              msg_rtime is set to the current time.
163

RETURN VALUE

165       On success, msgsnd() returns 0 and msgrcv() returns the number of bytes
166       actually copied into the mtext array.  On failure, both  functions  re‐
167       turn -1, and set errno to indicate the error.
168

ERRORS

170       msgsnd() can fail with the following errors:
171
172       EACCES The  calling  process does not have write permission on the mes‐
173              sage queue, and does not have the  CAP_IPC_OWNER  capability  in
174              the user namespace that governs its IPC namespace.
175
176       EAGAIN The  message  can't  be sent due to the msg_qbytes limit for the
177              queue and IPC_NOWAIT was specified in msgflg.
178
179       EFAULT The address pointed to by msgp isn't accessible.
180
181       EIDRM  The message queue was removed.
182
183       EINTR  Sleeping on a full message queue condition, the process caught a
184              signal.
185
186       EINVAL Invalid  msqid value, or nonpositive mtype value, or invalid ms‐
187              gsz value (less than 0 or greater than the system value MSGMAX).
188
189       ENOMEM The system does not have enough memory to make  a  copy  of  the
190              message pointed to by msgp.
191
192       msgrcv() can fail with the following errors:
193
194       E2BIG  The  message  text  length is greater than msgsz and MSG_NOERROR
195              isn't specified in msgflg.
196
197       EACCES The calling process does not have read permission on the message
198              queue,  and  does  not  have the CAP_IPC_OWNER capability in the
199              user namespace that governs its IPC namespace.
200
201       EFAULT The address pointed to by msgp isn't accessible.
202
203       EIDRM  While the process was sleeping to receive a message, the message
204              queue was removed.
205
206       EINTR  While the process was sleeping to receive a message, the process
207              caught a signal; see signal(7).
208
209       EINVAL msqid was invalid, or msgsz was less than 0.
210
211       EINVAL (since Linux 3.14)
212              msgflg specified MSG_COPY, but not IPC_NOWAIT.
213
214       EINVAL (since Linux 3.14)
215              msgflg specified both MSG_COPY and MSG_EXCEPT.
216
217       ENOMSG IPC_NOWAIT was specified in msgflg and no  message  of  the  re‐
218              quested type existed on the message queue.
219
220       ENOMSG IPC_NOWAIT  and  MSG_COPY were specified in msgflg and the queue
221              contains less than msgtyp messages.
222
223       ENOSYS (since Linux 3.8)
224              Both MSG_COPY and IPC_NOWAIT were specified in msgflg, and  this
225              kernel was configured without CONFIG_CHECKPOINT_RESTORE.
226

CONFORMING TO

228       POSIX.1-2001, POSIX.1-2008, SVr4.
229
230       The MSG_EXCEPT and MSG_COPY flags are Linux-specific; their definitions
231       can be obtained by defining the _GNU_SOURCE feature test macro.
232

NOTES

234       The msgp argument is declared as struct msgbuf * in glibc 2.0 and  2.1.
235       It  is  declared as void * in glibc 2.2 and later, as required by SUSv2
236       and SUSv3.
237
238       The following limits on message queue  resources  affect  the  msgsnd()
239       call:
240
241       MSGMAX Maximum  size  of  a message text, in bytes (default value: 8192
242              bytes).  On Linux, this limit  can  be  read  and  modified  via
243              /proc/sys/kernel/msgmax.
244
245       MSGMNB Maximum number of bytes that can be held in a message queue (de‐
246              fault value: 16384 bytes).  On Linux, this limit can be read and
247              modified  via  /proc/sys/kernel/msgmnb.   A  privileged  process
248              (Linux: a process with the CAP_SYS_RESOURCE capability) can  in‐
249              crease  the  size of a message queue beyond MSGMNB using the ms‐
250              gctl(2) IPC_SET operation.
251
252       The implementation has no intrinsic system-wide limits on the number of
253       message  headers  (MSGTQL)  and the number of bytes in the message pool
254       (MSGPOOL).
255

BUGS

257       In Linux 3.13 and earlier, if msgrcv() was  called  with  the  MSG_COPY
258       flag, but without IPC_NOWAIT, and the message queue contained less than
259       msgtyp messages, then the call would block until the  next  message  is
260       written  to  the queue.  At that point, the call would return a copy of
261       the message, regardless of whether that message was at the ordinal  po‐
262       sition msgtyp.  This bug is fixed in Linux 3.14.
263
264       Specifying  both  MSG_COPY  and MSC_EXCEPT in msgflg is a logical error
265       (since these flags impose different  interpretations  on  msgtyp).   In
266       Linux 3.13 and earlier, this error was not diagnosed by msgrcv().  This
267       bug is fixed in Linux 3.14.
268

EXAMPLES

270       The program below demonstrates the use of msgsnd() and msgrcv().
271
272       The example program is first run with the -s option to send  a  message
273       and then run again with the -r option to receive a message.
274
275       The following shell session shows a sample run of the program:
276
277           $ ./a.out -s
278           sent: a message at Wed Mar  4 16:25:45 2015
279
280           $ ./a.out -r
281           message received: a message at Wed Mar  4 16:25:45 2015
282
283   Program source
284
285       #include <stdio.h>
286       #include <stdlib.h>
287       #include <string.h>
288       #include <time.h>
289       #include <unistd.h>
290       #include <errno.h>
291       #include <sys/types.h>
292       #include <sys/ipc.h>
293       #include <sys/msg.h>
294
295       struct msgbuf {
296           long mtype;
297           char mtext[80];
298       };
299
300       static void
301       usage(char *prog_name, char *msg)
302       {
303           if (msg != NULL)
304               fputs(msg, stderr);
305
306           fprintf(stderr, "Usage: %s [options]\n", prog_name);
307           fprintf(stderr, "Options are:\n");
308           fprintf(stderr, "-s        send message using msgsnd()\n");
309           fprintf(stderr, "-r        read message using msgrcv()\n");
310           fprintf(stderr, "-t        message type (default is 1)\n");
311           fprintf(stderr, "-k        message queue key (default is 1234)\n");
312           exit(EXIT_FAILURE);
313       }
314
315       static void
316       send_msg(int qid, int msgtype)
317       {
318           struct msgbuf msg;
319           time_t t;
320
321           msg.mtype = msgtype;
322
323           time(&t);
324           snprintf(msg.mtext, sizeof(msg.mtext), "a message at %s",
325                   ctime(&t));
326
327           if (msgsnd(qid, &msg, sizeof(msg.mtext),
328                       IPC_NOWAIT) == -1) {
329               perror("msgsnd error");
330               exit(EXIT_FAILURE);
331           }
332           printf("sent: %s\n", msg.mtext);
333       }
334
335       static void
336       get_msg(int qid, int msgtype)
337       {
338           struct msgbuf msg;
339
340           if (msgrcv(qid, &msg, sizeof(msg.mtext), msgtype,
341                      MSG_NOERROR | IPC_NOWAIT) == -1) {
342               if (errno != ENOMSG) {
343                   perror("msgrcv");
344                   exit(EXIT_FAILURE);
345               }
346               printf("No message available for msgrcv()\n");
347           } else
348               printf("message received: %s\n", msg.mtext);
349       }
350
351       int
352       main(int argc, char *argv[])
353       {
354           int qid, opt;
355           int mode = 0;               /* 1 = send, 2 = receive */
356           int msgtype = 1;
357           int msgkey = 1234;
358
359           while ((opt = getopt(argc, argv, "srt:k:")) != -1) {
360               switch (opt) {
361               case 's':
362                   mode = 1;
363                   break;
364               case 'r':
365                   mode = 2;
366                   break;
367               case 't':
368                   msgtype = atoi(optarg);
369                   if (msgtype <= 0)
370                       usage(argv[0], "-t option must be greater than 0\n");
371                   break;
372               case 'k':
373                   msgkey = atoi(optarg);
374                   break;
375               default:
376                   usage(argv[0], "Unrecognized option\n");
377               }
378           }
379
380           if (mode == 0)
381               usage(argv[0], "must use either -s or -r option\n");
382
383           qid = msgget(msgkey, IPC_CREAT | 0666);
384
385           if (qid == -1) {
386               perror("msgget");
387               exit(EXIT_FAILURE);
388           }
389
390           if (mode == 2)
391               get_msg(qid, msgtype);
392           else
393               send_msg(qid, msgtype);
394
395           exit(EXIT_SUCCESS);
396       }
397

SEE ALSO

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

COLOPHON

402       This  page  is  part of release 5.13 of the Linux man-pages project.  A
403       description of the project, information about reporting bugs,  and  the
404       latest     version     of     this    page,    can    be    found    at
405       https://www.kernel.org/doc/man-pages/.
406
407
408
409Linux                             2021-03-22                          MSGOP(2)
Impressum