我的环境:
我正在尝试为POSIX消息队列设置属性,但代码不会更改属性。 我只获取默认属性值。
你能指出我的代码有什么问题吗?
我以用户(非root用户身份)执行a.out。
#include <stdio.h>
#include <mqueue.h> // for message queue
#include <sys/stat.h>
#include <stdlib.h> // for EXIT_FAILURE
#include <string.h>
/*
gcc [file] -lrt
*/
static void showAttr(mqd_t mqd)
{
struct mq_attr attr;
mq_getattr(mqd, &attr);
printf("maxmsg = %d\n", attr.mq_maxmsg);
printf("msgsize = %d\n", attr.mq_msgsize);
printf("curmsgs = %d\n", attr.mq_curmsgs);
}
int main()
{
mqd_t mqd;
int flags;
int ret;
struct mq_attr attr;
flags = O_RDWR | O_CREAT;
attr.mq_flags = 0; // or O_NONBLOCK
attr.mq_maxmsg = 60;
attr.mq_msgsize = 120;
attr.mq_curmsgs = 0;
// POSIX IPC name should start with "/"
mqd = mq_open("/mq", flags,
// (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH),
0644,
&attr );
if (mqd < 0) {
printf("open failed\n");
exit(EXIT_FAILURE);
}
printf("open ok\n");
sleep(1);
showAttr(mqd);
ret = mq_close(mqd);
if (ret != 0) {
printf("open failed\n");
exit(EXIT_FAILURE);
}
printf("close ok\n");
return 0;
}
我发现以下代码有效。 但是,当我尝试设置attr.mq_maxmsg(= 60)时,mq_open失败。
#include <stdio.h>
#include <mqueue.h> // for message queue
#include <sys/stat.h>
#include <stdlib.h> // for EXIT_FAILURE
#include <string.h>
#include <errno.h>
/*
gcc [file] -lrt
*/
static void showAttr(mqd_t mqd)
{
struct mq_attr attr;
mq_getattr(mqd, &attr);
printf("maxmsg = %d\n", attr.mq_maxmsg);
printf("msgsize = %d\n", attr.mq_msgsize);
printf("curmsgs = %d\n", attr.mq_curmsgs);
}
int main()
{
mqd_t mqd;
int flags;
int ret;
struct mq_attr attr;
flags = O_RDWR | O_CREAT;
// POSIX IPC name should start with "/"
// 1. once open without attribute setting
mqd = mq_open("/mq", flags,
(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) );
mq_getattr(mqd, &attr);
mq_unlink("/mq");
mq_close(mqd);
// 2. set values of attribute
// attr.mq_maxmsg = 10;
attr.mq_msgsize = 120;
// 3. allocate attribute
mqd = mq_open("/mq", flags,
(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH),
// 0644,
&attr );
if (mqd < 0) {
printf("open failed %d\n", mqd);
exit(EXIT_FAILURE);
}
printf("open ok\n");
sleep(1);
showAttr(mqd);
ret = mq_close(mqd);
if (ret != 0) {
printf("open failed\n");
exit(EXIT_FAILURE);
}
printf("close ok\n");
return 0;
}
答案 0 :(得分:1)
mq_open()
返回一个已存在的队列,其属性在创建时设置。因此,O_CREAT标志无效,您指定的属性也会被忽略。
在打开之前调用mq_unlink()
,也可以设置O_EXCL,并查看差异。
答案 1 :(得分:1)
以下代码有效。
我在mq_open()之前使用mq_unlink()作为pilcrow建议。
而且,问题的另一个原因是我将attr.mq_maxmsg设置为大于10(在/ proc / sys / fs / mqueue / msg_max中定义)。 如果我将attr.mq_maxmsg设置为小于等于10,则设置属性没有问题。
#include <stdio.h>
#include <mqueue.h> // for message queue
#include <sys/stat.h>
#include <stdlib.h> // for EXIT_FAILURE
#include <string.h>
#include <errno.h>
/*
gcc [file] -lrt
*/
static void showAttr(mqd_t mqd)
{
struct mq_attr attr;
mq_getattr(mqd, &attr);
printf("maxmsg = %d\n", attr.mq_maxmsg);
printf("msgsize = %d\n", attr.mq_msgsize);
printf("curmsgs = %d\n", attr.mq_curmsgs);
}
int main()
{
mqd_t mqd;
int flags;
int ret;
struct mq_attr attr;
flags = O_RDWR | O_CREAT;
mq_unlink("/mq");
attr.mq_flags = 0;
attr.mq_maxmsg = 3; // ***
attr.mq_msgsize = 141;
attr.mq_curmsgs = 0;
mqd = mq_open("/mq", flags,
(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH),
&attr );
if (mqd < 0) {
printf("open failed %d\n", mqd);
exit(EXIT_FAILURE);
}
printf("open ok\n");
sleep(1);
showAttr(mqd);
ret = mq_close(mqd);
if (ret != 0) {
printf("open failed\n");
exit(EXIT_FAILURE);
}
printf("close ok\n");
return 0;
}