MQ_OPEN - Linux手册页
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)。
Interface | Attribute | Value |
mq_open() | Thread safety | MT-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/。