最近项目一直到Docker环境部署,之前一直正常运行的程序突然出现 msgrcv函数 返回 errorno 13 'permission denied 的
错误,且一直频繁打印该错误,尝试了各种方法和阅读man手册后,找到了改问题的解决办法,主要就是需要在 msgget函数中 设置一下权限,附demo源码,在docker运行正常(demo可以直接运行)
-
msgget函数的flag设置为
IPC_CREAT|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH
或者
IPC_CREAT|00666
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#include <signal.h>
#include <algorithm>
#include <iostream>
#include <sys/stat.h>
int g_msgId = 0;
bool g_exit = false;
struct MsgType {
long msgType;
char buffer[64];
void* thread_fun(void* parg) {
//create message queue
MsgType msg;
key_t key;
int msgid;
key = ftok(".", 1);
if (-1 == key) {
printf("ftok error %d\n", errno);
return NULL;
else {
printf("Get message key:%d\n", key);
//Flag 'S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH' need in docker
//Otherwise, pemission denied error will occur
msgid = msgget(key, IPC_CREAT|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if (-1 == msgid) {
printf("msgget error:%d\n", errno);
return NULL;
else {
printf("Get msgid:%d\n", msgid);
g_msgId = msgid;
while (!g_exit) {
printf("wait for message\n");
ssize_t msgLen = msgrcv(msgid, &msg, sizeof(MsgType) - sizeof(long), 1, 0);
sleep(1);
if (-1 == msgLen) {
printf("msgrcv error:%d\n", errno);
} else {
printf("received message:%s\n", msg.buffer);
printf("thread[%d] exit now\n", msgid);
return NULL;
void Start() {
pthread_t id = 0;
std::cout << "Start" << std::endl;
pthread_attr_t init;
pthread_attr_init(&init);
pthread_create(&id, NULL, thread_fun, NULL);
pthread_attr_setdetachstate(&init, PTHREAD_CREATE_DETACHED);
std::cout << "Thread id:" << id << std::endl;
void SendMsg(const char* szMsg) {
MsgType msg;
msg.msgType = 1;
strcpy(msg.buffer, szMsg);
int nRes = msgsnd(g_msgId, &msg, sizeof(MsgType) - sizeof(long), 0);
if (-1 == nRes) {
printf("msgsnd error:%d", errno);
} else {
std::cout << "msgsnd success" << std::endl;
int main()
int index = 0;
std::cout << "I am start now.";
Start();
while (true)
int code;
std::cout << "Please input a key... 0:exit" << std::endl;
std::cin >> code;
if (0 == code) {
break;
else {
SendMsg("A test message");
SendMsg("exit");
g_exit = true;
std::cout << "I am exit now" << std::endl;
sleep(2);
return 0;
最近项目一直到Docker环境部署,之前一直正常运行的程序突然出现 msgrcv函数 返回 errorno 13 'permission denied 的错误,且一直频繁打印该错误,尝试了各种方法和阅读man手册后,找到了改问题的解决办法,主要就是需要在 msgget函数中 设置一下权限,附demo源码,在docker运行正常(demo可以直接运行)msgget函数的flag设置为 I...
sdbadmin@sdbserver1:/opt$ apt-get update
Reading package lists... Done
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
1、进入容器使用-u 0 参数
docker exec -u 0 -it 容器名称 /bin/ba..
msgget()函数被用来创建新的消息队列或获取已有的消息队列。其函数定义如下:
系统调用: msgget()
函数声明: int msgget ( key_t key, int msgflg )
返回值: message queue identifier on succe
当你在使用 Docker 时遇到 "permission denied" 的错误提示,通常是因为你在执行 Docker 命令时缺少了必要的权限。
以下是一些可能的解决方案:
1. 确认当前用户是否拥有执行 Docker 命令的权限。通常,只有 root 用户和拥有 sudo 权限的用户才能执行 Docker 命令。
2. 确认 Docker daemon 是否正在运行。你可以使用以下命令检查 Docker 服务的状态:
systemctl status docker
如果 Docker daemon 没有运行,请使用以下命令启动 Docker:
systemctl start docker
3. 确认你是否已经将当前用户添加到 docker 用户组中。如果没有,你可以使用以下命令将当前用户添加到 docker 用户组中:
sudo usermod -aG docker $USER
请注意,在执行该命令后,你需要注销并重新登录才能使更改生效。
4. 确认你是否已经正确地设置了 Docker 配置文件中的文件共享和目录挂载权限。你可以查阅 Docker 文档了解更多信息。
如果上述解决方案不能解决问题,那么可能是其他因素导致的错误。你可以查阅 Docker 的官方文档或社区论坛寻求更多帮助。