mqd_t
mq_open(
const char *name
, int oflag
)
mqd_t
mq_open(
const char *name
, int oflag
, mode_t mode
, struct mq_attr *attr
)
)
function 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,
which should conform to the construction rules for a pathname.
The
name
should begin with a slash character.
The processes calling
mq_open(
)
with the same value of
name
will refer 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(
)
fails and returns 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 are
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 must specify exactly one of the first three values
(access modes) below in the value of
oflag
:
O_RDONLY
O_WRONLY
O_RDWR
O_RDONLY
and
O_WRONLY
.
In all cases, a message queue may be open multiple times in the same or different processes for sending/receiving messages.
Any combination of the remaining flags may be specified in the value of
oflag
:
O_CREAT
mode
and
attr
.
If the pathname
name
has already been used to create a message queue that still exists,
then this flag will have 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 will be 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
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
O_EXCL
and
O_CREAT
are set,
mq_open(
)
fails if the message queue
name
exists.
The check for the existence of the message queue and the creation of the
message queue if it does not exist will be atomic with respect to other
threads executing
mq_open(
)
naming the same
name
with
O_EXCL
and
O_CREAT
set.
If
O_EXCL
is set and
O_CREAT
is not set, the result is undefined.
O_NONBLOCK
EAGAIN
.
The
mq_open()
function does not add or remove messages from the queue.
)
returns a message queue descriptor.
Otherwise, the function returns
(
mqd_t
)
-1 and sets the global variable
errno
to indicate the error.
)
function fails if:
EACCES
]
oflag
are denied, or the message queue does not exist and permission
to create the message queue is denied.
EEXIST
]
O_CREAT
and
O_EXCL
are set and the named message queue already exists.
EINTR
]
)
function was interrupted by a signal.
EINVAL
]
)
function is not supported for the given name, or
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
]
ENAMETOOLONG
]
name
argument exceeds
{
PATH_MAX
}
or a pathname component is longer than
{
NAME_MAX
}.
ENFILE
]
ENOENT
]
O_CREAT
is not set and the named message queue does not exist.
ENOSPC
]