summaryrefslogtreecommitdiffstats
path: root/man2/msgop.2
diff options
context:
space:
mode:
Diffstat (limited to 'man2/msgop.2')
-rw-r--r--man2/msgop.2684
1 files changed, 0 insertions, 684 deletions
diff --git a/man2/msgop.2 b/man2/msgop.2
deleted file mode 100644
index e09c632..0000000
--- a/man2/msgop.2
+++ /dev/null
@@ -1,684 +0,0 @@
-.\" Copyright 1993 Giorgio Ciucci <giorgio@crcc.it>
-.\" and Copyright 2015 Bill Pemberton <wfp5p@worldbroken.com>
-.\"
-.\" SPDX-License-Identifier: Linux-man-pages-copyleft
-.\"
-.\" Modified Tue Oct 22 16:40:11 1996 by Eric S. Raymond <esr@thyrsus.com>
-.\" Modified Mon Jul 10 21:09:59 2000 by aeb
-.\" Modified 1 Jun 2002, Michael Kerrisk <mtk.manpages@gmail.com>
-.\" Language clean-ups.
-.\" Enhanced and corrected information on msg_qbytes, MSGMNB and MSGMAX
-.\" Added note on restart behavior of msgsnd() and msgrcv()
-.\" Formatting clean-ups (argument and field names marked as .I
-.\" instead of .B)
-.\" Modified, 27 May 2004, Michael Kerrisk <mtk.manpages@gmail.com>
-.\" Added notes on capability requirements
-.\" Modified, 11 Nov 2004, Michael Kerrisk <mtk.manpages@gmail.com>
-.\" Language and formatting clean-ups
-.\" Added notes on /proc files
-.\"
-.TH MSGOP 2 2023-10-31 "Linux man-pages 6.7"
-.SH NAME
-msgrcv, msgsnd \- System V message queue operations
-.SH LIBRARY
-Standard C library
-.RI ( libc ", " \-lc )
-.SH SYNOPSIS
-.nf
-.B #include <sys/msg.h>
-.P
-.BI "int msgsnd(int " msqid ", const void " msgp [. msgsz "], size_t " msgsz ,
-.BI " int " msgflg );
-.P
-.BI "ssize_t msgrcv(int " msqid ", void " msgp [. msgsz "], size_t " msgsz \
-", long " msgtyp ,
-.BI " int " msgflg );
-.fi
-.SH DESCRIPTION
-The
-.BR msgsnd ()
-and
-.BR msgrcv ()
-system calls are used to send messages to,
-and receive messages from, a System\ V message queue.
-The calling process must have write permission on the message queue
-in order to send a message, and read permission to receive a message.
-.P
-The
-.I msgp
-argument is a pointer to a caller-defined structure
-of the following general form:
-.P
-.in +4n
-.EX
-struct msgbuf {
- long mtype; /* message type, must be > 0 */
- char mtext[1]; /* message data */
-};
-.EE
-.in
-.P
-The
-.I mtext
-field is an array (or other structure) whose size is specified by
-.IR msgsz ,
-a nonnegative integer value.
-Messages of zero length (i.e., no
-.I mtext
-field) are permitted.
-The
-.I mtype
-field must have a strictly positive integer value.
-This value can be
-used by the receiving process for message selection
-(see the description of
-.BR msgrcv ()
-below).
-.SS msgsnd()
-The
-.BR msgsnd ()
-system call appends a copy of the message pointed to by
-.I msgp
-to the message queue whose identifier is specified
-by
-.IR msqid .
-.P
-If sufficient space is available in the queue,
-.BR msgsnd ()
-succeeds immediately.
-The queue capacity is governed by the
-.I msg_qbytes
-field in the associated data structure for the message queue.
-During queue creation this field is initialized to
-.B MSGMNB
-bytes, but this limit can be modified using
-.BR msgctl (2).
-A message queue is considered to be full if either of the following
-conditions is true:
-.IP \[bu] 3
-Adding a new message to the queue would cause the total number of bytes
-in the queue to exceed the queue's maximum size (the
-.I msg_qbytes
-field).
-.IP \[bu]
-Adding another message to the queue would cause the total number of messages
-in the queue to exceed the queue's maximum size (the
-.I msg_qbytes
-field).
-This check is necessary to prevent an unlimited number of zero-length
-messages being placed on the queue.
-Although such messages contain no data,
-they nevertheless consume (locked) kernel memory.
-.P
-If insufficient space is available in the queue, then the default
-behavior of
-.BR msgsnd ()
-is to block until space becomes available.
-If
-.B IPC_NOWAIT
-is specified in
-.IR msgflg ,
-then the call instead fails with the error
-.BR EAGAIN .
-.P
-A blocked
-.BR msgsnd ()
-call may also fail if:
-.IP \[bu] 3
-the queue is removed,
-in which case the system call fails with
-.I errno
-set to
-.BR EIDRM ;
-or
-.IP \[bu]
-a signal is caught, in which case the system call fails
-with
-.I errno
-set to
-.BR EINTR ; see
-.BR signal (7).
-.RB ( msgsnd ()
-is never automatically restarted after being interrupted by a
-signal handler, regardless of the setting of the
-.B SA_RESTART
-flag when establishing a signal handler.)
-.P
-Upon successful completion the message queue data structure is updated
-as follows:
-.IP \[bu] 3
-.I msg_lspid
-is set to the process ID of the calling process.
-.IP \[bu]
-.I msg_qnum
-is incremented by 1.
-.IP \[bu]
-.I msg_stime
-is set to the current time.
-.SS msgrcv()
-The
-.BR msgrcv ()
-system call removes a message from the queue specified by
-.I msqid
-and places it in the buffer
-pointed to by
-.IR msgp .
-.P
-The argument
-.I msgsz
-specifies the maximum size in bytes for the member
-.I mtext
-of the structure pointed to by the
-.I msgp
-argument.
-If the message text has length greater than
-.IR msgsz ,
-then the behavior depends on whether
-.B MSG_NOERROR
-is specified in
-.IR msgflg .
-If
-.B MSG_NOERROR
-is specified, then
-the message text will be truncated (and the truncated part will be
-lost); if
-.B MSG_NOERROR
-is not specified, then
-the message isn't removed from the queue and
-the system call fails returning \-1 with
-.I errno
-set to
-.BR E2BIG .
-.P
-Unless
-.B MSG_COPY
-is specified in
-.I msgflg
-(see below),
-the
-.I msgtyp
-argument specifies the type of message requested, as follows:
-.IP \[bu] 3
-If
-.I msgtyp
-is 0,
-then the first message in the queue is read.
-.IP \[bu]
-If
-.I msgtyp
-is greater than 0,
-then the first message in the queue of type
-.I msgtyp
-is read, unless
-.B MSG_EXCEPT
-was specified in
-.IR msgflg ,
-in which case
-the first message in the queue of type not equal to
-.I msgtyp
-will be read.
-.IP \[bu]
-If
-.I msgtyp
-is less than 0,
-then the first message in the queue with the lowest type less than or
-equal to the absolute value of
-.I msgtyp
-will be read.
-.P
-The
-.I msgflg
-argument is a bit mask constructed by ORing together zero or more
-of the following flags:
-.TP
-.B IPC_NOWAIT
-Return immediately if no message of the requested type is in the queue.
-The system call fails with
-.I errno
-set to
-.BR ENOMSG .
-.TP
-.BR MSG_COPY " (since Linux 3.8)"
-.\" commit 4a674f34ba04a002244edaf891b5da7fc1473ae8
-Nondestructively fetch a copy of the message at the ordinal position
-in the queue specified by
-.I msgtyp
-(messages are considered to be numbered starting at 0).
-.IP
-This flag must be specified in conjunction with
-.BR IPC_NOWAIT ,
-with the result that, if there is no message available at the given position,
-the call fails immediately with the error
-.BR ENOMSG .
-Because they alter the meaning of
-.I msgtyp
-in orthogonal ways,
-.B MSG_COPY
-and
-.B MSG_EXCEPT
-may not both be specified in
-.IR msgflg .
-.IP
-The
-.B MSG_COPY
-flag was added for the implementation of
-the kernel checkpoint-restore facility and
-is available only if the kernel was built with the
-.B CONFIG_CHECKPOINT_RESTORE
-option.
-.TP
-.B MSG_EXCEPT
-Used with
-.I msgtyp
-greater than 0
-to read the first message in the queue with message type that differs
-from
-.IR msgtyp .
-.TP
-.B MSG_NOERROR
-To truncate the message text if longer than
-.I msgsz
-bytes.
-.P
-If no message of the requested type is available and
-.B IPC_NOWAIT
-isn't specified in
-.IR msgflg ,
-the calling process is blocked until one of the following conditions occurs:
-.IP \[bu] 3
-A message of the desired type is placed in the queue.
-.IP \[bu]
-The message queue is removed from the system.
-In this case, the system call fails with
-.I errno
-set to
-.BR EIDRM .
-.IP \[bu]
-The calling process catches a signal.
-In this case, the system call fails with
-.I errno
-set to
-.BR EINTR .
-.RB ( msgrcv ()
-is never automatically restarted after being interrupted by a
-signal handler, regardless of the setting of the
-.B SA_RESTART
-flag when establishing a signal handler.)
-.P
-Upon successful completion the message queue data structure is updated
-as follows:
-.IP
-.I msg_lrpid
-is set to the process ID of the calling process.
-.IP
-.I msg_qnum
-is decremented by 1.
-.IP
-.I msg_rtime
-is set to the current time.
-.SH RETURN VALUE
-On success,
-.BR msgsnd ()
-returns 0
-and
-.BR msgrcv ()
-returns the number of bytes actually copied into the
-.I mtext
-array.
-On failure, both functions return \-1, and set
-.I errno
-to indicate the error.
-.SH ERRORS
-.BR msgsnd ()
-can fail with the following errors:
-.TP
-.B EACCES
-The calling process does not have write permission on the message queue,
-and does not have the
-.B CAP_IPC_OWNER
-capability in the user namespace that governs its IPC namespace.
-.TP
-.B EAGAIN
-The message can't be sent due to the
-.I msg_qbytes
-limit for the queue and
-.B IPC_NOWAIT
-was specified in
-.IR msgflg .
-.TP
-.B EFAULT
-The address pointed to by
-.I msgp
-isn't accessible.
-.TP
-.B EIDRM
-The message queue was removed.
-.TP
-.B EINTR
-Sleeping on a full message queue condition, the process caught a signal.
-.TP
-.B EINVAL
-Invalid
-.I msqid
-value, or nonpositive
-.I mtype
-value, or
-invalid
-.I msgsz
-value (less than 0 or greater than the system value
-.BR MSGMAX ).
-.TP
-.B ENOMEM
-The system does not have enough memory to make a copy of the
-message pointed to by
-.IR msgp .
-.P
-.BR msgrcv ()
-can fail with the following errors:
-.TP
-.B E2BIG
-The message text length is greater than
-.I msgsz
-and
-.B MSG_NOERROR
-isn't specified in
-.IR msgflg .
-.TP
-.B EACCES
-The calling process does not have read permission on the message queue,
-and does not have the
-.B CAP_IPC_OWNER
-capability in the user namespace that governs its IPC namespace.
-.TP
-.B EFAULT
-The address pointed to by
-.I msgp
-isn't accessible.
-.TP
-.B EIDRM
-While the process was sleeping to receive a message,
-the message queue was removed.
-.TP
-.B EINTR
-While the process was sleeping to receive a message,
-the process caught a signal; see
-.BR signal (7).
-.TP
-.B EINVAL
-.I msqid
-was invalid, or
-.I msgsz
-was less than 0.
-.TP
-.BR EINVAL " (since Linux 3.14)"
-.I msgflg
-specified
-.BR MSG_COPY ,
-but not
-.BR IPC_NOWAIT .
-.TP
-.BR EINVAL " (since Linux 3.14)"
-.I msgflg
-specified both
-.B MSG_COPY
-and
-.BR MSG_EXCEPT .
-.TP
-.B ENOMSG
-.B IPC_NOWAIT
-was specified in
-.I msgflg
-and no message of the requested type existed on the message queue.
-.TP
-.B ENOMSG
-.B IPC_NOWAIT
-and
-.B MSG_COPY
-were specified in
-.I msgflg
-and the queue contains less than
-.I msgtyp
-messages.
-.TP
-.BR ENOSYS " (since Linux 3.8)"
-Both
-.B MSG_COPY
-and
-.B IPC_NOWAIT
-were specified in
-.IR msgflg ,
-and this kernel was configured without
-.BR CONFIG_CHECKPOINT_RESTORE .
-.SH STANDARDS
-POSIX.1-2008.
-.P
-The
-.B MSG_EXCEPT
-and
-.B MSG_COPY
-flags are Linux-specific;
-their definitions can be obtained by defining the
-.B _GNU_SOURCE
-.\" MSG_COPY since glibc 2.18
-feature test macro.
-.SH HISTORY
-POSIX.1-2001, SVr4.
-.P
-The
-.I msgp
-argument is declared as \fIstruct msgbuf\ *\fP in
-glibc 2.0 and 2.1.
-It is declared as \fIvoid\ *\fP
-in glibc 2.2 and later, as required by SUSv2 and SUSv3.
-.SH NOTES
-The following limits on message queue resources affect the
-.BR msgsnd ()
-call:
-.TP
-.B MSGMAX
-Maximum size of a message text, in bytes (default value: 8192 bytes).
-On Linux, this limit can be read and modified via
-.IR /proc/sys/kernel/msgmax .
-.TP
-.B MSGMNB
-Maximum number of bytes that can be held in a message queue
-(default value: 16384 bytes).
-On Linux, this limit can be read and modified via
-.IR /proc/sys/kernel/msgmnb .
-A privileged process
-(Linux: a process with the
-.B CAP_SYS_RESOURCE
-capability)
-can increase the size of a message queue beyond
-.B MSGMNB
-using the
-.BR msgctl (2)
-.B IPC_SET
-operation.
-.P
-The implementation has no intrinsic system-wide limits on the
-number of message headers
-.RB ( MSGTQL )
-and the number of bytes in the message pool
-.RB ( MSGPOOL ).
-.SH BUGS
-In Linux 3.13 and earlier,
-if
-.BR msgrcv ()
-was called with the
-.B MSG_COPY
-flag, but without
-.BR IPC_NOWAIT ,
-and the message queue contained less than
-.I msgtyp
-messages, then the call would block until the next message is written
-to the queue.
-.\" http://marc.info/?l=linux-kernel&m=139048542803605&w=2
-At that point, the call would return a copy of the message,
-.I regardless
-of whether that message was at the ordinal position
-.IR msgtyp .
-This bug is fixed
-.\" commit 4f87dac386cc43d5525da7a939d4b4e7edbea22c
-in Linux 3.14.
-.P
-Specifying both
-.B MSG_COPY
-and
-.B MSC_EXCEPT
-in
-.I msgflg
-is a logical error (since these flags impose different interpretations on
-.IR msgtyp ).
-In Linux 3.13 and earlier,
-.\" http://marc.info/?l=linux-kernel&m=139048542803605&w=2
-this error was not diagnosed by
-.BR msgrcv ().
-This bug is fixed
-.\" commit 4f87dac386cc43d5525da7a939d4b4e7edbea22c
-in Linux 3.14.
-.SH EXAMPLES
-The program below demonstrates the use of
-.BR msgsnd ()
-and
-.BR msgrcv ().
-.P
-The example program is first run with the \fB\-s\fP option to send a
-message and then run again with the \fB\-r\fP option to receive a
-message.
-.P
-The following shell session shows a sample run of the program:
-.P
-.in +4n
-.EX
-.RB "$" " ./a.out \-s"
-sent: a message at Wed Mar 4 16:25:45 2015
-.P
-.RB "$" " ./a.out \-r"
-message received: a message at Wed Mar 4 16:25:45 2015
-.EE
-.in
-.SS Program source
-\&
-.\" SRC BEGIN (msgop.c)
-.EX
-#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, "Usage: %s [options]\en", prog_name);
- fprintf(stderr, "Options are:\en");
- fprintf(stderr, "\-s send message using msgsnd()\en");
- fprintf(stderr, "\-r read message using msgrcv()\en");
- fprintf(stderr, "\-t message type (default is 1)\en");
- fprintf(stderr, "\-k message queue key (default is 1234)\en");
- exit(EXIT_FAILURE);
-}
-\&
-static void
-send_msg(int qid, int msgtype)
-{
- time_t t;
- 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("sent: %s\en", 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("msgrcv");
- exit(EXIT_FAILURE);
- }
- printf("No message available for msgrcv()\en");
- } else {
- printf("message received: %s\en", msg.mtext);
- }
-}
-\&
-int
-main(int argc, char *argv[])
-{
- int qid, opt;
- int mode = 0; /* 1 = send, 2 = receive */
- int msgtype = 1;
- int msgkey = 1234;
-\&
- while ((opt = getopt(argc, argv, "srt:k:")) != \-1) {
- switch (opt) {
- case \[aq]s\[aq]:
- mode = 1;
- break;
- case \[aq]r\[aq]:
- mode = 2;
- break;
- case \[aq]t\[aq]:
- msgtype = atoi(optarg);
- if (msgtype <= 0)
- usage(argv[0], "\-t option must be greater than 0\en");
- break;
- case \[aq]k\[aq]:
- msgkey = atoi(optarg);
- break;
- default:
- usage(argv[0], "Unrecognized option\en");
- }
- }
-\&
- if (mode == 0)
- usage(argv[0], "must use either \-s or \-r option\en");
-\&
- 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);
-}
-.EE
-.\" SRC END
-.SH SEE ALSO
-.BR msgctl (2),
-.BR msgget (2),
-.BR capabilities (7),
-.BR mq_overview (7),
-.BR sysvipc (7)