모두, 나는 제멋대로 였다고 생각했습니다.
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
감사합니다!
리턴 값과 오류 코드를 확인하고 * stackoverflow에 대한 도움말을 찾으려면 실마리를 찾아야합니다. 함수에서 반환 값을 무시하기 때문에 사람들이 당신에게 말할 것임에주의를 기울일 것임이 분명하지 않습니다. –
좋은 지적. 내가 할게. 감사. –
반갑습니다. 즉, 물론 mq_ * 가족 함수를 의미합니다. –