MQ_OPEN - Linux手册页

时间:2019-08-20 18:00:54  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-08-13

名称

mq_open-打开消息队列

语法

#include <fcntl.h>           /* For O_* constants */
#include <sys/stat.h>        /* For mode constants */
#include <mqueue.h>

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);

与-lrt链接。

说明

mq_open()创建一个新的POSIX消息队列或打开一个现有的队列。队列由名称标识。有关名称构造的详细信息,请参见mq_overview(7)。

oflag参数指定用于控制调用操作的标志。 (可以通过包含。获得标志值的定义。)确切地,必须在oflag中指定以下之一:

O_RDONLY
打开队列仅接收消息。
O_WRONLY
打开队列以仅发送消息。
O_RDWR
打开队列以发送和接收消息。

可以在oflag中另外对零个或多个以下标志进行或运算:

O_CLOEXEC(since Linux 2.6.26)
设置消息队列描述符的执行时关闭标志。请参阅open(2),以获取有关此标志为何有用的讨论。
O_CREAT
如果不存在,请创建消息队列。消息队列的所有者(用户ID)设置为调用过程的有效用户ID。组所有权(组ID)设置为调用过程的有效组ID。
O_EXCL
如果在oflag中指定了O_CREAT,并且已经存在具有给定名称的队列,则失败并显示错误EEXIST。
O_NONBLOCK
以非阻塞模式打开队列。在正常情况下会阻塞mq_receive(3)和mq_send(3)的情况下,这些函数会因错误EAGAIN而失败。

如果在oflag中指定O_CREAT,则必须提供两个附加参数。模式参数指定要放置在新队列上的权限,就像open(2)一样。 (可以通过包含。获得权限位的符号定义。)权限设置针对进程umask进行掩码。

指向attr的struct mq_attr字段指定队列允许的最大消息数和最大消息大小。此结构定义如下:

struct mq_attr {
    long mq_flags;       /* Flags (ignored for mq_open()) */
    long mq_maxmsg;      /* Max. # of messages on queue */
    long mq_msgsize;     /* Max. message size (bytes) */
    long mq_curmsgs;     /* # of messages currently in queue
                            (ignored for mq_open()) */
};

调用mq_open()时仅使用mq_maxmsg和mq_msgsize字段;其余字段中的值将被忽略。

如果attr为NULL,则使用实现定义的默认属性创建队列。从Linux 3.5开始,可以使用两个/ proc文件控制这些默认值。有关详细信息,请参见mq_overview(7)。

返回值

成功时,mq_open()返回消息队列描述符,以供其他消息队列功能使用。发生错误时,mq_open()返回(mqd_t)-1,设置errno表示错误。

错误说明

EACCES
该队列存在,但是调用者无权以指定模式打开它。
EACCES
名称包含多个斜杠。
EEXIST
O_CREAT和O_EXCL都在oflag中指定,但是已经存在具有该名称的队列。
EINVAL
名称不遵循mq_overview(7)中的格式。
EINVAL
在oflag中指定了O_CREAT,并且attr不为NULL,但是attr->mq_maxmsg或attr->mq_msqsize无效。这两个字段都必须大于零。在没有特权的进程中(不具有CAP_SYS_RESOURCE功能),attr->mq_maxmsg必须小于或等于msg_max限制,而attr->mq_msgsize必须小于或等于msgsize_max限制。另外,即使在特权进程中,attr->mq_maxmsg也不能超过HARD_MAX限制。 (有关这些限制的详细信息,请参见mq_overview(7)。)
EMFILE
已达到打开文件和消息队列描述符的每个进程的限制(请参阅getrlimit(2)中RLIMIT_NOFILE的描述)。
ENAMETOOLONG
名字太长。
ENFILE
已达到打开文件和消息队列总数的系统范围限制。
ENOENT
没有在oflag中指定O_CREAT标志,并且不存在具有该名称的队列。
ENOENT
名称只是" /",后面没有其他字符。
ENOMEM
内存不足。
ENOSPC
没有足够的空间来创建新的消息队列。这可能是因为遇到了queues_max限制;参见mq_overview(7)。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
mq_open()Thread safetyMT-Safe

遵循规范

POSIX.1-2001,POSIX.1-2008。

备注

C library/kernel differences

mq_open()库函数是在同名的系统调用之上实现的。库函数执行检查,以确保名称以斜杠(/)开头,如果没有则给出EINVAL错误。内核系统调用期望name不包含前面的斜杠,因此C库函数将没有前面的斜杠的name(即name + 1)传递给系统调用。

BUGS

在2.6.14之前的内核中,进程umask未被应用于mode中指定的权限。

另外参见

mq_close(3),mq_getattr(3),mq_notify(3),mq_receive(3),mq_send(3),mq_unlink(3),mq_overview(7)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/