2012-09-25 2 views
2

모두, 나는 제멋대로 였다고 생각했습니다.
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

리턴 값과 오류 코드를 확인하고 * stackoverflow에 대한 도움말을 찾으려면 실마리를 찾아야합니다. 함수에서 반환 값을 무시하기 때문에 사람들이 당신에게 말할 것임에주의를 기울일 것임이 분명하지 않습니다. –

+0

좋은 지적. 내가 할게. 감사. –

+0

반갑습니다. 즉, 물론 mq_ * 가족 함수를 의미합니다. –

답변

1

맨 페이지 메시지 :

메시지 큐 mq_open (3)

유일한 속성으로 생성 될 때 mq_maxmsg 및 mq_msgsize 필드가 설정되어 있는지 수정 가능 여부는 mq_flags에있는 O_NONBLOCK 플래그의 설정입니다. newattr의 다른 필드는 입니다.

+0

다른 man 페이지를 읽고있다. mine says : mq_flags 필드에는 open과 관련된 플래그가 들어있다. 메세지 대기 행렬 설명. 이 필드는 큐가 mq_open (3)에 의해 생성 될 때 초기화됩니다. 이 필드에 나타날 수있는 유일한 플래그는 O_NONBLOCK입니다. 그래서, 부분적으로 맞습니다 - mq_flags 필드. 계속 진행 : mq_maxen과 mq_msgsize 필드는 메시지 큐가 mq_open (3)에 의해 생성 될 때 설정됩니다. mq_maxmsg 필드는 mq_send (3)를 사용하여 큐에 넣을 수있는 메시지 수의 상한값입니다. mq_msgsize 필드는 메시지 크기의 상한입니다. –

+0

다음 두 단락은 어떻게됩니까? –

+0

내 맨 페이지에는 게시 한 모든 정보가 들어 있기 때문입니다. 이 하나가 내 시스템에있는 것과 일치하는 것 같습니다 : http://linux.die.net/man/3/mq_getattr –

관련 문제