docker与宿主机共享内存通信
docker与宿主机共享内存通信
docker中的进程要与宿主机使用共享内存通信,需要在启动容器的时候指定“–ipc=host”选项。然后再编写相应的共享内存的程序,一个跑在宿主机上,另一个跑在docker上面。
宿主机程序准备
- shm_data.h
#ifndef _SHMDATA_H_HEADER
#define _SHMDATA_H_HEADER#define TEXT_SZ 2048struct shared_use_st
{int written; // 作为一个标志,非0:表示可读,0:表示可写char text[TEXT_SZ]; // 记录写入 和 读取 的文本
};#endif
- shm_slave.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include "shmdata.h"int main(int argc, char **argv)
{void *shm = NULL;struct shared_use_st *shared = NULL;char buffer[BUFSIZ + 1]; // 用于保存输入的文本int shmid;// 创建共享内存shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);if (shmid == -1){fprintf(stderr, "shmget failed\n");exit(EXIT_FAILURE);}// 将共享内存连接到当前的进程地址空间shm = shmat(shmid, (void *)0, 0);if (shm == (void *)-1){fprintf(stderr, "shmat failed\n");exit(EXIT_FAILURE);}printf("Memory attched at %X\n", (int)shm);// 设置共享内存shared = (struct shared_use_st *)shm;while (1) // 向共享内存中写数据{// 数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本while (shared->written == 1){sleep(1);printf("Waiting...\n");}// 向共享内存中写入数据printf("Enter some text: ");fgets(buffer, BUFSIZ, stdin);strncpy(shared->text, buffer, TEXT_SZ);// 写完数据,设置written使共享内存段可读shared->written = 1;// 输入了end,退出循环(程序)if (strncmp(buffer, "end", 3) == 0){break;}}// 把共享内存从当前进程中分离if (shmdt(shm) == -1){fprintf(stderr, "shmdt failed\n");exit(EXIT_FAILURE);}sleep(2);exit(EXIT_SUCCESS);
}
- makefile
all:gcc -o shm_slave shm_slave.c
clean:rm -rf shm_slave
docker镜像准备
- shm_data.h
#ifndef _SHMDATA_H_HEADER
#define _SHMDATA_H_HEADER#define TEXT_SZ 2048struct shared_use_st
{int written; // 作为一个标志,非0:表示可读,0:表示可写char text[TEXT_SZ]; // 记录写入 和 读取 的文本
};#endif
- shm_master.c
#include <stddef.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "shmdata.h"int main(int argc, char **argv)
{void *shm = NULL;struct shared_use_st *shared; // 指向shmint shmid; // 共享内存标识符// 将内容写入到文件,可以通过查看文件确定共享内存是否成功FILE* file = fopen("t.txt","w+");// 创建共享内存shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);if (shmid == -1){fprintf(stderr, "shmat failed\n");exit(EXIT_FAILURE);}// 将共享内存连接到当前进程的地址空间shm = shmat(shmid, 0, 0);if (shm == (void *)-1){fprintf(stderr, "shmat failed\n");exit(EXIT_FAILURE);}printf("\nMemory attached at %X\n", (int)shm);// 设置共享内存shared = (struct shared_use_st*)shm; // 注意:shm有点类似通过 malloc() 获取到的内存,所以这里需要做个 类型强制转换shared->written = 0;while (1) // 读取共享内存中的数据{// 没有进程向内存写数据,有数据可读取if (shared->written == 1){printf("You wrote: %s", shared->text);fputs(shared->text,file);fflush(file);sleep(1);// 读取完数据,设置written使共享内存段可写shared->written = 0;// 输入了 end,退出循环(程序)if (strncmp(shared->text, "end", 3) == 0){break;}}else // 有其他进程在写数据,不能读取数据{sleep(1);}}// 把共享内存从当前进程中分离if (shmdt(shm) == -1){fprintf(stderr, "shmdt failed\n");flcose(file);exit(EXIT_FAILURE);}// 删除共享内存if (shmctl(shmid, IPC_RMID, 0) == -1){fprintf(stderr, "shmctl(IPC_RMID) failed\n");fclose(file);exit(EXIT_FAILURE);}flcose(file);exit(EXIT_SUCCESS);
}
- makefile
all:gcc -o shm_master shm_master.c
clean:rm -rf shm_master
- Dockerfile
FROM gcc:latestRUN mkdir /usr/src/shm_testCOPY shm_master.c shm_data.h makefile /usr/src/shm_test/WORKDIR /usr/src/shm_testRUN makeCMD ["./shm_master"]
运行
运行时需要先下载docker,获取支持c语言编译运行的基础镜像,比如ubuntu、gcc等。这里使用gcc作为基础镜像。
sudo apt install docker
sudo docker pull gcc
# 查看一下gcc的镜像是否拉取下来了
docker images
基础镜像有了后就可以基于基础镜像构建docker容器,基于上面所写的dockerfile,构建镜像:
sudo docker build -t shm_master:v1 .
# 查看镜像是否创建成功
sudo docker images
镜像创建成功后就可以启动容器,启动时记得加上参数“–ipc”。
# fe9c3bd6d102是之前创建成功的镜像的id
sudo docker run -d --ipc=host --name master fe9c3bd6d102
成功启动容器后可以进入到容器内部查看通信相关信息。
sudo docker exec -it master /bin/bash
reference
需要特别说明的是:以下共享内存的代码均来自博客,在此表示感谢。docker镜像创建参考自北极之光的博客。
-
https://www.cnblogs.com/hailun1987/p/9697236.html
-
https://www.jianshu.com/p/7eb7c7f62bf3
-
https://www.cnblogs.com/52php/p/5861372.html
相关文章:
docker与宿主机共享内存通信
docker与宿主机共享内存通信 docker中的进程要与宿主机使用共享内存通信,需要在启动容器的时候指定“–ipchost”选项。然后再编写相应的共享内存的程序,一个跑在宿主机上,另一个跑在docker上面。 宿主机程序准备 shm_data.h #ifndef _SH…...
A股风格因子看板 (2023.10 第13期)
该因子看板跟踪A股风格因子,该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子,用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第13期,指数组合数据截止日2023-09-30,要点如下 近1年A股风格因子检验统…...
ORB-SLAM3算法2之EuRoc、TUM和KITTI开源数据集运行ORB-SLAM3生成轨迹并用evo工具评估轨迹
文章目录 0 引言1 数据和真值1.1 TUM1.2 EuRoc1.3 KITTI2 ORB-SLAM3的EuRoc示例2.1 纯单目的示例2.2 纯单目的轨迹评估2.3 纯双目的示例2.4 纯双目的轨迹评估2.5 单目和IMU的示例2.6 单目和IMU的轨迹评估2.7 双目和IMU的示例2.8 双目和IMU的轨迹评估2.9 前四种的评估结果对比3 …...
【蓝桥杯选拔赛真题07】C++小球自由落体 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析
目录 C/C++小球自由落体 一、题目要求 1、编程实现 2、输入输出 二、算法分析...
期中考成绩一键私发
作为一名教师,期中考试后最繁忙的事情之一就是发布成绩。每个学生都希望尽快知道自己的成绩,而作为老师,我们需要一种更高效、更方便的方式来完成这项任务。今天,我就来给大家介绍一种成绩查询系统,让我们一起告别繁琐…...
idea中Run/Debug Python项目报错 Argument for @NotNull parameter ‘module‘ of ...
idea中Run/Debug Python项目报错 Argument for NotNull parameter module of ... idea中运行Python项目main.py时报错: Error running main: Argument for NotNull parameter module of com/intellij/openapi/roots/ModuleRootManager.getInstance must not be nu…...
计算机网络第3章-TCP协议(2)
TCP拥塞控制 TCP拥塞控制的三种方式: 慢启动、拥塞避免、快速恢复 慢启动 当一条TCP连接开始时,cwnd的值是一个很小的MSS值,这使得初始发送速率大约为MSS/RTT。 在慢启动状态,cwnd的值以1个MSS开始并且每当传输的报文段首次被…...
SQL注入——二次注入漏洞
文章目录 SQL注入——二次注入漏洞1. 二次注入原理2. 二次注入需要具备的两个条件3. 二次注入实例4. 总结 SQL注入——二次注入漏洞 1. 二次注入原理 在第一次插入恶意数据的时候,只是对其中的特殊字符进行了转义,在写入数据库的时候还是原来的字符&am…...
【c++|opencv】二、灰度变换和空间滤波---1.灰度变换、对数变换、伽马变换
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 灰度变换、对数变换、伽马变换 1. 灰度变换 #include <iostream> #include <opencv2/opencv.hpp>using namespace std; using namespace c…...
【vue3】子传父-事件总线-mitt(子组件派发事件,父组件接收事件和传递的参数)
安装库:cnpm install mitt 封装 eventbus.ts: src->utils->eventbus.ts //eventbus.tsimport mitt from mittconst emitter mitt()export default emitter使用 B2.vue: //B2.vue <template><div class"aa">…...
【杂记】java 大集合进行拆分
日常中需要对一个大的集合进行拆分成多个小集合,其主要思路为: 设置需要拆分多少个小集合 A大集合里面有多少条数据 B计算出每个集合里面有多个条数据 CB/A计算出看是否存在余数 DB%A采用集合(List.subList())的方法对大集合进行拆分,循环A变进行集合拆…...
select...for update 锁表了?
在MySQL中,事务A中使用select...for update where id1锁住了,某一条数据,事务还没提交,此时,事务B中去用select ... where id1查询那条数据,会阻塞等待吗? select...for update在MySQL中&#…...
使用ControlNet生成视频(Pose2Pose)
目录 ControlNet 介绍 ControlNet 14种模型分别是用来做什么的 ControlNet 运行环境搭建 用到的相关模型地址 ControlNet 介绍 ControlNet 是一种用于控制扩散模型的神经网络结构,可以通过添加额外的条件来实现对图像生成的控制。它通过将神经网络块的权重复制到…...
基于Docker使用Minikube
1. 查看并操控Minikube状态信息 Minikube相当于docker中的一个container,可以在Docker Desktop中看到并操控Minikube container的相关状态: 通过以下命令查看当前docker中的container: % docker ps CONTAINER ID IMAGE …...
Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作
文章目录 Stable Diffusion安装AnimateDiff插件适配sdxl模型适配 Stable Diffusion使用插件安装界面设置基础文生图加入lora的文生图 Stable Diffusion安装 我的情况比较特殊,显卡版本太老,最高也就支持cuda10.2,因此只能安装pytorch1.12.1&…...
ruoyi框架前端vue部署生产环境教程
前端有子目录,后端有项目名称,请看第3种 第1种 前端nginx没有子目录,后端也没有访问的项目名。这种是最简单的。 vue.config.js 只需要修改target中的IP和端口,就是后端访问的IP和端口 # vue.config.js devServer: {host: 0.…...
leetcode第369周赛
2917. 找出数组中的 K-or 值 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数: 只有在 nums 中,至少存在 k 个元素的第 i 位值为 1 ,那么 K-or 中的第 i 位的值才是 1 。 返回 nums …...
如何在维格云中自动新增一行或多行数据?
简介 在日常使用维格云中,通常会出现一张表中有数据发生变化时,需要另一张表同时新增一些数据,比如: 项目管理中,每新增一个项目,都要在任务表中产生若干个固定的任务;或一个任务要自动生成若干子任务当一笔订单状态变为成交后,可能要在客户成功表中新增一行记录;帮…...
Three.js 开发引擎的特点
Three.js 是一个流行的开源 3D 游戏和图形引擎,用于在 Web 浏览器中创建高质量的三维图形和互动内容。以下是 Three.js 的主要特点和适用场合,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作…...
k8s声明式资源管理方式
Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式:主要用于 api 接口之间消息的传递 YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读 YAML 语法格式: ●大小写…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
