我正在尝试创建一个队列,但我收到了一个拒绝权限错误。我之前收到此错误,但后来我添加了代码,用于创建密钥错误,并且它正在运行。从那以后我唯一改变的是我将队列创建代码放在一个单独的函数中。这就像我的代码一样:
key_t key1;
int msqid1;
int main(int arc, char *argv[])
{
getKeys();
queueCreate();
}
void getKeys()
{
if ((key1 = ftok(".", '1')) == -1)
{
perror("key1 creation");
exit(1);
}
}
void queueCreate()
{
if ((msqid1 = msgget(key1, 0666 | IPC_CREAT)) == -1)
{
perror("msqid1 creation");
exit(1);
}
}
抛出的错误是“msqid1创建:权限被拒绝”。有什么想法吗?
答案 0 :(得分:2)
很可能你没有在成功创建消息队列的情况下销毁它,所以现在你无法重新创建它,因为它仍然存在。
您没有指明您所在的平台。传统上,您使用ipcs
命令获取各种IPC系统(共享内存,信号量和消息队列)的状态,并ipcrm
删除不再需要的IPC系统。< / p>
答案 1 :(得分:0)
您的错误似乎是EACCES
而不是EEXIST
。我的linux手册页说:
EACCES密钥存在消息队列,但调用进程确实存在 没有访问队列的权限,并且没有 CAP_IPC_OWNER功能。
您是否检查过这些情况?
您正在使用当前目录作为ftok
的路径。也许更改为“/ tmp”中的普通本地文件而不是您的主文件夹(nfs?)。