所有人都曾经认为我是理智的,现在不太确定。
我正在尝试创build一个消息队列,其mq_msgsize属性不是8192,这似乎是默认值。 我已经附上了我的代码 – 它有一些printf显示的价值。 如果你能指出我做错了什么,我会永远感激。
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
谢谢!
该手册说:
当消息队列由mq_open(3)创建时,mq_maxmsg和mq_msgsize字段被设置。
和
唯一可以修改的属性是mq_flags中的O_NONBLOCK标志的设置。 newattr中的其他字段被忽略。