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 语法格式: ●大小写…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
