두 프로세스간에 메시지를 보내려고합니다. 하지만 메신저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 구조체에 문자 또는 메시지 문자열로 제한됩니다 다른 데이터 유형을 사용할 수 있습니까?
'msg_queue = msgget (key, IPC_CREAT | 0666)' – Arash
이걸로'msgget'이 호출 될 때 EACCES를 얻습니다. '/ tmp/msg_queue' 파일을 지우면'msgget'이고'msgsnd'는 성공입니다 ... 고마워요! 하지만 왜?! – mvollmer
이것은 이상합니다 .. 그것은 매번 작동합니다 .. 파일을 삭제하고 | 0666을 msgget 플래그에 추가하십시오. 메시지 큐가 ipcs로 표시됩니다! 고맙습니다. – mvollmer