2017-12-23 20 views
0

OpenSuse 42.3 Leap에서 일하고 있습니다. 이것은 유닉스 메시지 대기열을 처음 접했을 때 새로운 대기열을 간단하게 여는 데 몇 가지 기본적인 문제가 있습니다. 내 원래 문제는 내가 두 개의 큐를 열 수 없습니다하지만 몇 가지 시도 후 나는 문제가이 이상한 행동으로 감소했습니다 : 내가 컴파일하면C : 메시지 큐를 열 수 없습니다.

실행은 표준 출력으로 위대한 작품을

#include<stdio.h> 
#include <mqueue.h> 

int main() { 

// printf("Hello world!\n"); 

/* create queue */ 
char *q_name = "/myQueue"; 
mqd_t desc = mq_open(q_name, O_RDWR | O_CREAT); 
if(desc == (mqd_t) -1) 
    perror("Error in mq_open"); 
printf("We have opened %d\n", desc); 

/* close descriptor and unlink name */ 
if (mq_close(desc)) perror("Error in close:"); 
if (mq_unlink(q_name)) perror("Error in unlink:"); 

return 0; 
} 

이 :

We have opened 3 

대기열이 올바르게 닫혀 있으며 오류없이 다시 실행할 수 있습니다.

하지만

분명히
printf("Hello world!\n"); 

여전히 제대로 컴파일 라인의 주석 만 실행하면 간단 '안녕하세요 세계의 경우에는 대신

Hello world! 
Error in mq_open: Invalid argument 
We have opened -1 
Error in close:: Bad file descriptor 
Error in unlink:: No such file or directory 

를 출력하는 경우! 나는 인쇄하려고 :

printf("Hello world! My pid = %d\n", getpid()); 

다음 대신 Invalid argument

Error in mq_open: Bad address 

가 생성되는 오류입니다.

왜 이런 간단한 이유가 있습니다 printf가 대기열 열림에 충돌합니까? mq_open 매뉴얼 페이지에서

답변

2

: O_CREAT이 oflag에 지정된 경우

는 다음 두 개의 추가 인수가 제공해야합니다. [...]

당신은 그들을 제공하지 않으므로 정의되지 않은 동작이 있습니다. 무슨 일이 일어날 것인가하는 것은 잃어버린 인수가 그들이 있던 곳의 어딘가에서 가져온 것이고, 그곳에있을 일은 당신의 프로그램이 전에했던 일에 따라 달라진다는 것입니다.