Skip site navigation (1)Skip section navigation (2)

FreeBSD Man Pages

Man Page or Keyword Search:
Man Architecture
Apropos Keyword Search (all sections) Output format
home | help
MQ_OPEN(2)                FreeBSD System Calls Manual               MQ_OPEN(2)

     mq_open - open a message queue (REALTIME)

     POSIX Real-time Library (librt, -lrt)

     #include <mqueue.h>

     mq_open(const char *name, int oflag, ...);

     The mq_open() system call establishes the connection between a process
     and a message queue with a message queue descriptor.  It creates an open
     message queue description that refers to the message queue, and a message
     queue descriptor that refers to that open message queue description.  The
     message queue descriptor is used by other functions to refer to that
     message queue.  The name argument points to a string naming a message
     queue.  The name argument should conform to the construction rules for a
     pathname.  The name should begin with a slash character.  Processes
     calling mq_open() with the same value of name refers to the same message
     queue object, as long as that name has not been removed.  If the name
     argument is not the name of an existing message queue and creation is not
     requested, mq_open() will fail and return an error.

     The oflag argument requests the desired receive and/or send access to the
     message queue.  The requested access permission to receive messages or
     send messages would be granted if the calling process would be granted
     read or write access, respectively, to an equivalently protected file.

     The value of oflag is the bitwise-inclusive OR of values from the
     following list.  Applications should specify exactly one of the first
     three values (access modes) below in the value of oflag:

     O_RDONLY        Open the message queue for receiving messages.  The
                     process can use the returned message queue descriptor
                     with mq_receive(), but not mq_send().  A message queue
                     may be open multiple times in the same or different
                     processes for receiving messages.

     O_WRONLY        Open the queue for sending messages.  The process can use
                     the returned message queue descriptor with mq_send() but
                     not mq_receive().  A message queue may be open multiple
                     times in the same or different processes for sending

     O_RDWR          Open the queue for both receiving and sending messages.
                     The process can use any of the functions allowed for
                     O_RDONLY and O_WRONLY.  A message queue may be open
                     multiple times in the same or different processes for
                     sending messages.

     Any combination of the remaining flags may be specified in the value of

     O_CREAT         Create a message queue.  It requires two additional
                     arguments: mode, which is of type mode_t, and attr, which
                     is a pointer to an mq_attr structure.  If the pathname
                     name has already been used to create a message queue that
                     still exists, then this flag has no effect, except as
                     noted under O_EXCL.  Otherwise, a message queue will be
                     created without any messages in it.  The user ID of the
                     message queue will be set to the effective user ID of the
                     process, and the group ID of the message queue will be
                     set to the effective group ID of the process.  The
                     permission bits of the message queue will be set to the
                     value of the mode argument, except those set in the file
                     mode creation mask of the process.  When bits in mode
                     other than the file permission bits are specified, the
                     effect is unspecified.  If attr is NULL, the message
                     queue is created with implementation-defined default
                     message queue attributes.  If attr is non-NULL and the
                     calling process has the appropriate privilege on name,
                     the message queue mq_maxmsg and mq_msgsize attributes
                     will be set to the values of the corresponding members in
                     the mq_attr structure referred to by attr.  If attr is
                     non-NULL, but the calling process does not have the
                     appropriate privilege on name, the mq_open() function
                     will fail and return an error without creating the
                     message queue.

     O_EXCL          If O_EXCL and O_CREAT are set, mq_open() will fail if the
                     message queue name exists.

     O_NONBLOCK      Determines whether an mq_send() or mq_receive() waits for
                     resources or messages that are not currently available,
                     or fails with errno set to EAGAIN; see mq_send(2) and
                     mq_receive(2) for details.

     The mq_open() system call does not add or remove messages from the queue.

     FreeBSD implements message queue based on file descriptor.  The
     descriptor is inherited by child after fork(2).  The descriptor is closed
     in a new image after exec(3).  The select(2) and kevent(2) system calls
     are supported for message queue descriptor.

     Upon successful completion, the function returns a message queue
     descriptor; otherwise, the function returns (mqd_t)-1 and sets the global
     variable errno to indicate the error.

     The mq_open() system call will fail if:

     [EACCES]           The message queue exists and the permissions specified
                        by oflag are denied, or the message queue does not
                        exist and permission to create the message queue is

     [EEXIST]           O_CREAT and O_EXCL are set and the named message queue
                        already exists.

     [EINTR]            The mq_open() function was interrupted by a signal.

     [EINVAL]           The mq_open() function is not supported for the given

     [EINVAL]           O_CREAT was specified in oflag, the value of attr is
                        not NULL, and either mq_maxmsg or mq_msgsize was less
                        than or equal to zero.

     [EMFILE]           Too many message queue descriptors or file descriptors
                        are currently in use by this process.

     [ENAMETOOLONG]     The length of the name argument exceeds {PATH_MAX} or
                        a pathname component is longer than {NAME_MAX}.

     [ENFILE]           Too many message queues are currently open in the

     [ENOENT]           O_CREAT is not set and the named message queue does
                        not exist.

     [ENOSPC]           There is insufficient space for the creation of the
                        new message queue.

     mq_close(2), mq_getattr(2), mq_receive(2), mq_send(2), mq_setattr(2),
     mq_timedreceive(3), mq_timedsend(3), mq_unlink(3)

     The mq_open() system call conforms to IEEE Std 1003.1-2004 (``POSIX.1'').

     Support for POSIX message queues first appeared in FreeBSD 7.0.

     This implementation places strict requirements on the value of name: it
     must begin with a slash (`/') and contain no other slash characters.

     Portions of this text are reprinted and reproduced in electronic form
     from IEEE Std 1003.1, 2004 Edition, Standard for Information Technology
     -- Portable Operating System Interface (POSIX), The Open Group Base
     Specifications Issue 6, Copyright (C) 2001-2004 by the Institute of
     Electrical and Electronics Engineers, Inc and The Open Group.  In the
     event of any discrepancy between this version and the original IEEE and
     The Open Group Standard, the original IEEE and The Open Group Standard is
     the referee document.  The original Standard can be obtained online at

FreeBSD 11.0-PRERELEASE        November 29, 2005       FreeBSD 11.0-PRERELEASE


Want to link to this manual page? Use this URL:

home | help