linux mq_open игнорирует атрибут mq_msgsize

Все, раньше думали, что я в здравом уме, теперь не так уверены.
Я пытаюсь создать очередь сообщений с атрибутом 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

Спасибо!

2

Решение

На странице написано:

Поля mq_maxmsg и mq_msgsize устанавливаются, когда сообщение
очередь создается mq_open (3)

а также

Единственный атрибут, который можно изменить, это настройка
Флаг O_NONBLOCK в mq_flags. Другие поля в newattr
игнорируются.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]