最近项目一直到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 的官方文档或社区论坛寻求更多帮助。