linux mq open,linux mq_open忽略mq_msgsize属性

所有的,过去认为我是理智的,现在不太确定。

我想创建一个消息队列,其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_ *'家庭功能。 –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值