所有的,过去认为我是理智的,现在不太确定。
我想创建一个消息队列,其mq_msgsize属性不是8192,这似乎是默认值。我在下面附上我的代码 - 它有一些printf显示值。如果你能指出我做错了什么,我会永远感激。linux mq_open忽略mq_msgsize属性
bool Subscriber::Subscribe(void)
{
mqd_t qid;
bool brv = false;
msg_topic_t topic = this->GetTopic();
struct mq_attr q_attr;
int rv = 0;
if (VALID_TOPIC(topic))
{
if (this->GetName().length() > 0)
{
string qnamestr = this->GetName();
if (qnamestr[0] != '/')
{
qnamestr = "/" + qnamestr;
this->SetName(qnamestr);
}
const char * qname = (const char *) qnamestr.c_str();
q_attr.mq_msgsize = 256;
q_attr.mq_curmsgs = 0;
q_attr.mq_flags = O_NONBLOCK;
q_attr.mq_maxmsg = 10;
qid = mq_open(qname, O_RDONLY|O_CREAT, 0644, &q_attr);
if ((mqd_t) -1 != qid)
{
rv = mq_getattr(qid, &q_attr);
if (rv != 0)
{ perror(" get_attr1 failed: "); }
printf(" queue size is now: %d\n", q_attr.mq_msgsize);
if (q_attr.mq_msgsize > 1024)
{
struct mq_attr old_attr;
q_attr.mq_msgsize = 1024;
rv = mq_setattr(qid, &q_attr, &old_attr);
if (rv != 0)
{ perror(" could not update message size: "); }
rv = mq_getattr(qid, &q_attr);
if (rv != 0)
{ perror(" get_attr2 failed: "); }
printf(" queue size is now: %d\n", q_attr.mq_msgsize);
}
this->SetOutboxID(qid);
brv = true;
DLOG(INFO) << " qid = " << qid << endl;
MessageCenter * mc = MessageCenter::GetInstance();
mc->AddSubscriber((Subscriber *) this);
}
}
}
drain_queue(this->GetOutboxID());
return(brv);
}
输出看起来是这样的:现在 队列大小是:现在8192 队列大小是:现在8192 队列大小为:8192
谢谢!
+0
建议您通过检查返回值和错误代码来查找线索,然后*寻求帮助。当你忽略函数的返回值时,你会注意到任何人会告诉你的东西并不是显而易见的。 –
+0
好点。我会去做。谢谢。 –
+0
不客气。即,当然,我的意思是'mq_ *'家庭功能。 –