Linux mq_open忽略mq_msgsize属性
linux mq_open ignores mq_msgsize attribute
所有,曾经认为我是理智的,现在不太确定。
我正在尝试创建一个消息队列,其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: %dn", 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: %dn", 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_maxmsg和mq_msgsize字段在消息时设置 队列由 mq_open(3) 创建
和
唯一可以修改的属性是 O_NONBLOCK mq_flags旗帜。 newattr 中的其他字段是 忽视。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- Qt Quick-如何仅从c++代码与qml属性交互
- 用概念检查属性的类型
- C++如何将同一类的实例作为属性
- 按多个属性排序
- 主函数参数的属性
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- C++删除未使用的类属性会导致 std::logic_error
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 使用内存地址访问结构的属性值
- C++调用具有 *this 属性的单个帮助程序函数
- C++ 在堆栈中包含多态属性的类对象存储
- C++ 命名参数习惯用语 - 未设置字符串属性
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?