经四处查找,终于发现原因:
(1)attr.mq_maxmsg 不能超过文件 /proc/sys/fs/mqueue/msg_max 中的数值,我的机器上面是10。
(2)attr.mq_msgsize不能超过 /proc/sys/fs/mqueue/msgsize_max 的数值。
(3)消息队列名称前面必须加上斜杆。
详细请参考:命令“man mq_overview”
在man pages的第7章有关于消息队列的综述。
有一段叫/proc interfaces的标签,说明了一些限制问题。
The following interfaces can be used to limit the amount of kernel memory consumed by POSIX message queues and to set the default attributes for new message queues:
大意为:
以下接口可用于限制被POSIX消息队列消耗,和被设置新消息队列属性所消耗的内核内存量。
并且给出/proc/sys/fs/mqueue/目录下的文件详细解释
//文件内容如下:
msg_default 10
msg_max 10
msgsize_default 8192
msgsize_max 8192
queues_max 256
//本机系统为Ubuntu 16.04 LTS 64位
而UNP书上执行程序参数maxmsg为1024,已经超过系统限制的10。因此,总是提示错误信息:Invalid argument。
当将maxmsg参数大小小于等于10时,程序编译通过。