msgsnd 无权限错误
msgsnd no permission error
我想在两个进程之间发送消息。但是当我尝试使用 msgsnd()
发送消息时,出现 EACCES
错误
正在创建消息队列
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 The calling process does not have read permission on the message queue, and does not have the CAP_IPC_OWNER capability.
所以我使用 setcap
命令添加了以下功能
sudo setcap CAP_SETFCAP,CAP_IPC_OWNER+epi /home/mvollmer/build-APP-Desktop_Qt_5_6_1_GCC_64bit-Debug/APP
我已经与 getcap
核实过应用程序是否具有这些功能。没关系。但我仍然收到无权限错误。
当以 root 权限执行应用程序时,它的工作!
有一件事很奇怪,尽管 msgget 成功了 ipcs
没有显示任何消息队列。
所以我的错在哪里?
我正在使用 Linux Mint
附加问题:是否可以在 msg 结构中使用另一种数据类型然后是 char,或者消息是否仅限于字符串?
您需要阅读手册页。每 the POSIX msgget()
standard:
SYNOPSIS
#include <sys/msg.h>
int msgget(key_t key, int msgflg); [Option End]
DESCRIPTION
...
- The low-order 9 bits of msg_perm.mode shall be set to the low-order 9 bits of msgflg.
因此,这段代码
msg_queue = msgget(key, IPC_CREAT);
已将 "low-order 9 bits of msgflg" 全部设置为零。因此消息队列模式也是全部 0
- 没有任何人的权限。
我想在两个进程之间发送消息。但是当我尝试使用 msgsnd()
EACCES
错误
正在创建消息队列
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 The calling process does not have read permission on the message queue, and does not have the CAP_IPC_OWNER capability.
所以我使用 setcap
命令添加了以下功能
sudo setcap CAP_SETFCAP,CAP_IPC_OWNER+epi /home/mvollmer/build-APP-Desktop_Qt_5_6_1_GCC_64bit-Debug/APP
我已经与 getcap
核实过应用程序是否具有这些功能。没关系。但我仍然收到无权限错误。
当以 root 权限执行应用程序时,它的工作!
有一件事很奇怪,尽管 msgget 成功了 ipcs
没有显示任何消息队列。
所以我的错在哪里?
我正在使用 Linux Mint
附加问题:是否可以在 msg 结构中使用另一种数据类型然后是 char,或者消息是否仅限于字符串?
您需要阅读手册页。每 the POSIX msgget()
standard:
SYNOPSIS
#include <sys/msg.h> int msgget(key_t key, int msgflg); [Option End]
DESCRIPTION
...
- The low-order 9 bits of msg_perm.mode shall be set to the low-order 9 bits of msgflg.
因此,这段代码
msg_queue = msgget(key, IPC_CREAT);
已将 "low-order 9 bits of msgflg" 全部设置为零。因此消息队列模式也是全部 0
- 没有任何人的权限。