c-mq_open()API返回open无效参数



1.这部分代码返回"打开队列失败,错误参数无效",我不明白为什么!!

2.代码部分

struct mq_attr * attr = NULL  ;
attr = (struct mq_attr * ) malloc (sizeof(struct mq_attr));
attr->mq_maxmsg   = 100;
attr->mq_msgsize  = sizeof(upgrademanager_event_t);
upgrademanager->queue = mq_open("/upgrademanager_mqueue", O_RDWR|O_CREAT|O_EXCL, 0, & attr);                         
if (upgrademanager->queue == (mqd_t)-1)
TRACE_ERROR("Open queue failed, error %s. ", strerror(errno));

如果您的进程没有特权,即您没有以root身份运行它,那么您设置的mq_maxmsg值(即100(很可能大于默认值(即10(。尝试更改/proc/sys/fs/mqueue/msg_max 中的默认值

如果您以root用户身份运行,则不应该看到此问题,因为HARD_MSGMAX是65536(假设您在Linux 3.5及更高版本上运行(。

引用mq_open:的手册页

EINVALO_CREAT是在oflog中指定的,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(限制。(

mq_overview:的手册页报价

/proc/sys/fs/mqueue/msg_max此文件可用于查看和更改队列中最大消息数的上限值。该值充当给定attr->mq_maxmsg参数的上限到mq_open(3(。msg_max的默认值为10。最小值为1(2.6.28之前的内核为10(。上限为HARD_MSGMAX。忽略的msg_max限制特权进程(CAP_SYS_RESOURCE(,但仍然施加了HARD_MSGMAX上限。

最新更新