2012-01-16 3 views
0

이 코드를 작성하여 posix 메시지 큐를 작성했습니다. 그러나 "기능이 구현되지 않았습니다."라는 오류 메시지가 나타납니다.posix 메시지 큐 구현 중 오류 - "함수가 구현되지 않았습니다."

Q1. 플랫폼 관련 문제입니까? [Ubuntu 10.10을 사용하고 있습니다] 메시지 대기열을 활성화하기 위해 커널을 재구 성할 필요가있는 곳을 읽었습니다!

2. 실제로 메시지 대기열을 사용하기 전에 mqueue 서버를 시작하는 방법에 대해서도 읽었습니까?

누군가가 설명해 주시겠습니까 ..

#include <mqueue.h>  /* message queue stuff */ 
#include <iostream> 
#include <unistd.h>  /* for getopt() */ 
#include <errno.h>  /* errno and perror */ 
#include <fcntl.h>  /* O_flags */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

using namespace std; 

int main(int argc, char **argv) 
{ 

mqd_t msgQueueDescriptor; 
mq_attr attr; 

char Msg[]="msg"; 

attr.mq_maxmsg = 10; 
attr.mq_msgsize = sizeof(Msg); 
attr.mq_flags = 0; 

msgQueueDescriptor = mq_open("/myQueue", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH , attr); 
cout << msgQueueDescriptor << " " << errno << " " << strerror(errno); 
mq_close(msgQueueDescriptor); 

return 0; 
} 
+0

'mq_overview (7)'에 따르면, 커널을 빌드 할 때 기본적으로 POSIX 메시지 큐가 활성화되지만 우분투 패키지 관리자는이를 해제했을 수 있습니다. –

+0

@larsmans 어떻게 확인할 수 있습니까? 이것이 우분투의 출시 노트의 일부가 될 것입니까? 그리고 정말로 꺼 졌을 때 어떻게 다시 켤 수 있습니까? –

+0

우분투가 정말 이상한 것을 발견하면 우분투가 정말 이상하다고 생각합니다. fedora 15에서는 예제가 컴파일되고 성공적으로 연결됩니다. –

답변

0

가 나는 문제가 있었다, 또는 측면에서 오히려 실수 것을 깨달았다 생각합니다.

내가 here로부터 판독 무엇 -

[mq_open 참조하여()]

결과 : 유효한 메시지 큐 디스크립터 큐가 성공적으로 생성 -1 (errno를인지 설정 됨).

오류가 실제로 발생하면 의 값을으로 확인해야합니다. 그러나 위의 코드에서 오류 발생 여부와 상관없이 값을 인쇄하기 때문에 일부 쓰레기 값에 해당하는 오류 메시지가 errno에 저장됩니다.

그래서 내 코드는 다음과 같이해야한다 -

if ((msgQueueDescriptor = mq_open("/myQueue", O_RDWR|O_CREAT, 0664 ,NULL) == -1)) 
{ 
    cout << msgQueueDescriptor << " " << errno << " " << strerror(errno); 
} 
else 
{ 
    cout << "All is well" ; 
} 

난 그냥 바보가 자신 OUTA했다 않았다

는 PS가 쪽 : 메시지 큐는 우분투에서 사용 된 것으로 지금까지 10.10에 관한 한 , "nm"에 언급 된 플래그를 검사했는데,이 플래그는 매우 많이 활성화되어 있으며 지금은 메시지 대기열을 사용할 수 있습니다. 여러분 모두에게 감사드립니다 - larsmans, VJovic, n.m., Joachim Pileborg, jørgensen. 내 두 번째 질문

Q2 소개

. 또한 실제로 메시지 대기열을 사용하기 전에 전에 mqueue 서버를 시작하는 것에 대해 읽었습니까?

나는 그것이 QNX에 대한 요구 사항이라고 생각합니다.

+0

라이브러리 함수는'errno'를 0으로 설정하지 않습니다 (최소한 표준 C 라이브러리에는 없습니다). 그리고 설정 한 마지막 함수가 실제로 실패했다는 것을 나타내려면'errno' 만 검사해야합니다. . counter-example : 솔라리스에서는 많은 stdio 호출이 출력이 tty인지 확인하고, 호출이 완벽하게 성공 했음에도 불구하고 'errno == ENOTTY'를 남기지 않습니다. 그래서 네, 당신은 자신의 작은 어리 석음을 만들었지 만, 당신은 그것으로부터 배웠습니다. 그래서 그것은 소중한 경험입니다. –

+0

Q2의 경우 : 매뉴얼 페이지에 'mqueue server'시작에 대한 내용이 없으면 QNX가 상황에 대해 어떻게 생각하는지에 관계없이 그렇게 할 필요가 없습니다. –

+1

'errno'를 검사하는 것은 함수가 실패 할 경우에만해야한다. 실제로,'errno' [here] (http://pubs.opengroup.org/onlinepubs/009695399/functions/errno.html)에서 공식적인 POSIX 사양을 읽는다면 IEEE Std 1003.1-2001의이 볼륨에서 기능이 없다고합니다. errno를 0으로 설정하십시오. 함수를 성공적으로 호출 한 후 errno를 설정하면 해당 함수에 errno가 수정되지 않아야한다고 지정하지 않는 한 지정되지 않습니다 ._ –