2017-03-03 9 views
0

두 프로세스간에 메시지를 보내려고합니다. 하지만 메신저msgsnd 권한 오류가 없습니다

msgsnd() 메시지

를 전송

const char* MSG_QUEUE = "/tmp/msg_queue"; 

int file = open(MSG_QUEUE, O_CREAT | O_RDWR | O_APPEND, 0755); 
close(file); 
key_t key = ftok(MSG_QUEUE, 1); 
errno = 0; 
msg_queue = msgget(key, IPC_CREAT); 
if(msg_queue == -1) { 
    M_DEBUG("Error %s\r\n", strerror(errno)); 
} 

메시지 구조체에게 메시지 큐를

struct feld_msg_s { 
    long id; 
    char mtext[5]; 
}; 

만들기에 메시지를 보내려고 노력 EACCES 오류 msgsnd는의 맨 페이지에서

struct feld_msg_s a_msg = {1, "Test"}; errno = 0; int ret = msgsnd(msg_queue, &a_msg, sizeof(a_msg.mtext), 0); if(ret == -1) { if(errno == EACCES) { printf("\r\n NO PERMISSION\r\n"); } else { printf("msgsnd ERROR!: %s\r\n", strerror(errno)); } } 

EACCES 호출 프로세스를 기록 메시지 큐에 읽기 권한하지 않으며, CAP_IPC_OWNER 능력이 없습니다.

그래서 응용 프로그램이 기능을 가지고 있다면이 getcap으로 확인 한 setcap 명령

sudo setcap CAP_SETFCAP,CAP_IPC_OWNER+epi /home/mvollmer/build-APP-Desktop_Qt_5_6_1_GCC_64bit-Debug/APP 

다음과 같은 기능을 추가했습니다. 괜찮아. 하지만 여전히 사용 권한 없음 오류가 나타납니다.

루트 권한으로 응용 프로그램을 실행할 때 작동합니다!

한가지는 매우 이상합니다. msgget은 성공적이었습니다. ipcs 메시지 대기열을 표시하지 마십시오.

내 잘못은 어디에 있습니까?

나는 리눅스 민트

을 사용하고

추가 질문 : 다음 MSG 구조체에 문자 또는 메시지 문자열로 제한됩니다 다른 데이터 유형을 사용할 수 있습니까?

+1

'msg_queue = msgget (key, IPC_CREAT | 0666)' – Arash

+0

이걸로'msgget'이 호출 될 때 EACCES를 얻습니다. '/ tmp/msg_queue' 파일을 지우면'msgget'이고'msgsnd'는 성공입니다 ... 고마워요! 하지만 왜?! – mvollmer

+0

이것은 이상합니다 .. 그것은 매번 작동합니다 .. 파일을 삭제하고 | 0666을 msgget 플래그에 추가하십시오. 메시지 큐가 ipcs로 표시됩니다! 고맙습니다. – mvollmer

답변

0

설명서 페이지를 읽어야합니다. 당 the POSIX msgget() standard :

SYNOPSIS

#include <sys/msg.h> 

int msgget(key_t key, int msgflg); [Option End] 

DESCRIPTION

...

  • 의 하위 9 비트는 msg_perm.mode의 하위 9 비트를 msgflg으로 설정해야합니다.따라서

이 코드

msg_queue = msgget(key, IPC_CREAT); 

는 "하위에게 msgflg에 9 비트"가 모두 0으로 설정. 따라서 메시지 대기열 모드도 모두 0입니다. 누구에게도 권한이 없습니다.