msgsnd没有权限错误

时间:2017-03-03 07:48:24

标签: c unix message-queue linux-capabilities

我想在两个进程之间发送消息。但是,当我尝试使用EACCES

发送邮件时,我收到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];
};

发送消息

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));
    }
}
在msgsnd的联机帮助页中写

  

EACCES 调用进程对消息队列没有读取权限,并且没有CAP_IPC_OWNER功能。

所以我使用setcap命令

添加了以下功能
sudo setcap CAP_SETFCAP,CAP_IPC_OWNER+epi /home/mvollmer/build-APP-Desktop_Qt_5_6_1_GCC_64bit-Debug/APP 

如果应用程序获得了功能,我已经使用getcap进行了检查。没关系。但我仍然收到No Permission Error。

使用root权限执行应用程序时,它正在工作!

有一点很奇怪,尽管msgget是成功的ipcs不显示任何消息队列。

那我的错在哪里?

我正在使用Linux Mint

附加问题:可以在msg结构中使用另一种数据类型,然后使用char,还是限制为字符串的消息?

1 个答案:

答案 0 :(得分:0)

您需要阅读手册页。每the POSIX msgget() standard

  

<强> 概要

#include <sys/msg.h>

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

<强> 说明

     

...

     
      
  • msg_perm.mode 的低位9位应设置为 msgflg 的低位9位。
  •   

因此,这段代码

msg_queue = msgget(key, IPC_CREAT);

msgflg 的低位9位全部设置为零。因此,消息队列模式也是0 - 对任何人都没有权限。