前言

那么这里博主先安利一下一些干货满满的专栏啦!

手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm=1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏https://blog.csdn.net/yu_cblog/category_11464817.html这里是STL源码剖析专栏,这个专栏将会持续更新STL各种容器的模拟实现。

STL源码剖析https://blog.csdn.net/yu_cblog/category_11983210.html?spm=1001.2014.3001.5482


什么是System V的共享内存

进程间通信本质:让不同进程看到同一份资源

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

当我们用管道进行进程间通信的时候,我们知道,无论是匿名管道的形式还是命名管道的形式,最后都是需要在磁盘上创建部分空间的。

而共享内存的方案,只需要在内存的级别上创建共享的空间!

至于详细的系统调用接口,博主会在代码的注释中进行解释。

今天博主带着大家把框架搭好,关于通信的具体实现,博主会在下一期进行详细的讲解!


代码下载地址

Git地址https://github.com/Yufccode/BitCode/tree/main/Linux/%E4%BB%A3%E7%A0%81/1126_SystemV%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98%E6%A1%86%E6%9E%B6%E6%90%AD%E5%BB%BA


部分实现原理

 


shmServer.cc和shmClient.cc代码

注意,仅有这两份代码是不够用的,需要下载代码学习的伙伴要在博主上面提供的链接上下载代码。

这里面是一个完整的项目!

shmServer.cc


#include "comm.hpp" // 为了让key更好看,和命令行输出的对应起来
// 写一个转换成16进制的函数
std::string TransToHex(key_t k)
{
char buffer[32];
snprintf(buffer, sizeof buffer, "0x%x", k);
return buffer;
} int main()
{
// 1.创建公共的key值
key_t k = ftok(PATH_NAME, PROJ_ID);
assert(k != -1);
Log("create key done", Debug) << " server key: " << TransToHex(k) << std::endl; // 2.创建共享内存 -- 建议创建一个全新的共享内存 -- Server是通信的发起者
int shmid = shmget(k, SHM_SIZE, IPC_CREAT | IPC_EXCL | 0666);
if (shmid == -1)
{
// 创建失败
perror("shmget");
exit(1);
}
Log("create shm done", Debug) << " shmid: " << shmid << std::endl; //3.将制定的共享内存,挂接到自己的地址空间
sleep(3);
char* shmaddr = (char*)shmat(shmid,nullptr,0);
Log("attach shm done", Debug) << " shmid: " << shmid << std::endl;
sleep(3);
//我们会看到 挂接数会从0变成1! // ================= 这里面就是通信的逻辑了!================= //
//... // ================= 这里面就是通信的逻辑了!================= // //4.解除挂接
// 将制定的共享内存,从自己的地址空间中去关联
int n = shmdt(shmaddr);
assert(n!=-1);
(void)n;
Log("detach shm done", Debug) << " shmid: " << shmid << std::endl;
sleep(3); // last. 删除共享内存
//IPC_RMID表示,即便是有进程和当下的shm挂接,依旧删除共享内存
int n = shmctl(shmid, IPC_RMID, nullptr);
assert(n != -1);
(void)n;
Log("delete shm done", Debug) << " shmid: " << shmid << std::endl;
return 0;
}

shmClient.cc


#include "comm.hpp" int main()
{
key_t k = ftok(PATH_NAME, PROJ_ID);
if(k<0)
{
Log("create key failed", Error) << " client key: " << k << std::endl;
exit(1);
}
Log("create key done", Debug) << " client key: " << k << std::endl;
//获取共享内存
int shmid = shmget(k,SHM_SIZE,IPC_CREAT);
if(shmid<0)
{
Log("create shm success", Error) << " client key: " << k << std::endl;
exit(2);
}
Log("create shm failed", Debug) << " client key: " << k << std::endl;
sleep(5);
//
char* shmaddr = (char*)shmat(shmid,nullptr,0);
if(shmaddr ==nullptr)
{
Log("attach shm failed", Error) << " client key: " << k << std::endl;
exit(3);
}
Log("attach shm success", Debug) << " client key: " << k << std::endl;
sleep(5); //使用 //去关联
int n = shmdt(shmaddr);
assert(n!=-1);
Log("detach shm success", Debug) << " client key: " << k << std::endl;
sleep(5); //client要不要chmctl删除呢?不需要!!! return 0;
}

尾声

看到这里,相信大家对System V通信结构的基本搭建已经有了一定的理解了!如果大家觉得这篇文章对你们有帮助的话,不要吝啬你们的点赞收藏哦!

System V|共享内存基本通信框架搭建|【超详细的代码解释和注释】的更多相关文章

  1. Linux进程通信之System V共享内存

    前面已经介绍过了POSIX共享内存区,System V共享内存区在概念上类似POSIX共享内存区,POSIX共享内存区的使用是调用shm_open创建共享内存区后调用mmap进行内存区的映射,而Sys ...

  2. UNIX环境高级编程——System V 共享内存区

    共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最 ...

  3. System V 共享内存区

    1.概述 系统调用mmap通过映射一个普通文件实现共享内存.System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文 ...

  4. System V共享内存介绍

    (一)简单概念 共享内存作为一种进程间通信的方式,其相较于其他进程间通信方式而言最大的优点就是数据传输速率快.其内部实现的方式采用了Linux进程地址空间中的mmap文件映射区,将文件内容直接映射到各 ...

  5. 共享内存之——system V共享内存

    System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...

  6. 阐述linux IPC(五岁以下儿童):system V共享内存

    [版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途]         system V共享内存和posix ...

  7. Linux IPC实践(9) --System V共享内存

    共享内存API #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int ...

  8. php进程(线程)通信基础--System V共享内存

    PHP默认情况没有开启功能,要支持该功能在编译PHP的时候要加入下面几个选项  System V消息,--enable-sysvmsg   System V信号量支持,--enable-sysvsem ...

  9. Linux system v 共享内存

    system v 共享内存 #include <sys/types.h> #include <sys/shm.h> int shmget(key_t key, size_t s ...

  10. System V共享内存

    目录 1. 概述 2. System V共享内存API shmget shmat shmdt shmctl 3. 简单的程序 代码实现 common.h shmcreate.c shmrmid.c s ...

随机推荐

  1. Optional详细用法

    package com.example.apidemo.jdk8; import com.example.apidemo.vo.UserInfo; import java.math.BigDecima ...

  2. rem布局,使用手机端,pc大屏——亲测好用

    1 var docEl = document.documentElement, 2 //当设备的方向变化(设备横向持或纵向持)此事件被触发.绑定此事件时, 3 //注意现在当浏览器不支持orienta ...

  3. freeswitch-1.10.7 on centos7编译安装

    概述 最近由于项目需求,老版本的fs已经不适用,特此升级了freeswitch的版本,使用当前最新的1.10.7版本编译安装. 环境 centos:CentOS  release 7.0 (Final ...

  4. 电脑面试两道问题(python+shell)

    最近面试电脑代码面试遇到两个问题,供大家参考一下一.python脚本: 手写一个函数,实现两个数相加,并使用unittest与pytest工具测试函数正确性. 1.unnitest进行测试: impo ...

  5. 《DREEAM Guiding Attention with Evidence for Improving Document-Level Relation Extraction》阅读笔记

    代码   原文地址   预备知识: 1.什么是K-L散度(Kullback-Leibler Divergence)? K-L散度,是一种量化两种概率分布P和Q之间差异的方式,又叫相对熵.在概率学和统计 ...

  6. 【解决方案】如何使用 Http API 代替 OpenFeign 进行远程服务调用

    目录 前言 一.何为OpenFeign 1.1@FeignClient注解 1.2注意事项 二.常见的Http API 2.1Apache 2.2Okhttp 2.3Hutool 三.RestTemp ...

  7. 分享Go书籍-《Go Web编程》

    大家好,我是沙漠尽头的狼. 最近几天在看一本Go的书籍,看了100来页,感觉不错,分享给大家​.​ 书籍基本信息 书籍信息: 书名:Go Web编程 作 者:(新加坡)郑兆雄(Sau Sheong C ...

  8. 2023第十四届极客大挑战 — CRYPTO(WP全)

    浅谈: 本次大挑战我们队伍也是取得了第一名的成绩,首先要感谢同伴的陪伴和帮助.在共同的努力下终不负期望! 但遗憾的是我们没有在某个方向全通关的,呜呜呜~ 继续努力吧!要学的还很多.明年有机会再战!!加 ...

  9. 小程序:Now you can provide attr `wx:key` for a `wx:for` to improve performance. 的解决方案

    在wx:for后面添加wx:key="key" 可消除警告 <view wx:for="{{thisWeekMovies}}" wx:for-index= ...

  10. Spring——AOP练习

    模仿前面的例子,完成模拟JDBC操作 1.UserDAO接口,具有insert(String name)方法,UserDAOImpl实现它 2. 用前置增强,在插入之前,完成数据库连接.事务创建工作 ...