并发 ------- 2.4 进程间的通信 - 共享内存

前言:进程间的通信方式包括


    IPC: 
        1、管道
            pipe 无名管道
            fifo 有名管道 
        2、信号 signal        
        3、消息队列 System V消息队列 / POSIX消息队列     
        4、共享内存 System V共享内存 / POSIX共享内存        <-----------
        5、信号量   System V信号量 / POSIX信号量 
        6、socket套接字


1、共享内存 

    共享内存是进程间通信的一种方式,多个进程共享一段内存空间 “共享内存” 
    由于多个进程共享同一个内存,你往这个内存中写入数据,实际上就是往我的内存中写入数据
随内核的持续性 

        实现方式: 
            在内核中开辟了一块空间,其他进程通过 “内存映射” 的方式 
            获取到这个共享内存的首地址 

            进程p1可以映射这段内存,其他进程p2也可以映射这段内存 
            p1往这段内存中写入数据,实际上就是往p2中写入数据  


2、System V 共享内存的相关接口函数 

        System V IPC (msg/shm/sem) 操作流程: 
            (1)获取键值key 
            (2)创建或打开一个IPC对象,获取IPC对象的id 
            (3)操作:发送/接收 
            (4)其他控制操作: 删除/获取、设置属性/...
 

    1)获取键值key - ftok函数

    2)创建或者打开一个System V共享内存 shmget 

            NAME
                shmget - allocates a System V shared memory segment
            SYNOPSIS
                #include <sys/ipc.h>
                #include <sys/shm.h>

                int shmget(key_t key, size_t size, int shmflg);
                    功能:获取一块共享内存 
                    参数: 
                        key: 共享内存的键值 
                        size: 共享内存的大小 ,单位 字节 
                                当实际操作是 创建一个新的共享内存时,必须指定一个不为0的size值  
                                当实际操作是 打开一个共享内存时,那么size==0 
                        shmflg: 标志
                                (1)创建标志 
                                    IPC_CREAT | 权限 
                                    例子: 
                                        IPC_CREAT | 0666 
                                    注意: 
                                        如果创建失败的原因 是因为已经存在了 
                                        且 创建的标志为 IPC_CREAT | IPC_EXCL 一起使用 
                                        此时 errno == EEXIST 
                                (2)打开标志 
                                     0  
                    返回值: 
                        成功,返回共享内存的id 
                        失败,返回-1,并设置errno 


    3)共享内存的映射和解映射 

        NAME
            shmat, shmdt - System V shared memory operations

        SYNOPSIS
            #include <sys/types.h>
            #include <sys/shm.h>

            void *shmat(int shmid, const void *shmaddr, int shmflg);
                功能:用来映射一个System V共享内存到进程的地址空间
                参数: 
                    shmid: 共享内存的id 
                    shmaddr:指定映射到进程地址空间的哪个位置上 
                                一般为 NULL 让它自行分配 
                    shmflg:映射标志 
                            SHM_RDONLY  只读 
                            0           可读可写
                返回值: 
                    成功,返回映射区域的首地址 
                    失败,返回(void *) -1,同时errno被设置


            int shmdt(const void *shmaddr);
                功能:解除映射
                参数:
                    shmaddr: 映射区域的首地址 
                返回值: 
                    成功,返回0 
                    失败,返回-1,并设置errno 

       

            创建一个共享内存,实现父子进程的通信 子进程 --》 写入数据 父进程 --》 读取数据,并打印 #define PATHNAME "/home/china/"int main() {//1.获取键值key key_t key = ftok( PATHNAME, 5 );if( key == -1 ){perror("ftok error ");return -1;}printf("key = 0x%x\n", key );//2.创建或打开一个System V共享内存 int shm_id = shmget( key, 4096, IPC_CREAT | IPC_EXCL | 0666 );if( shm_id == -1 ){if( errno == EEXIST )   //已经存在 就直接打开{shm_id = shmget( key, 0, 0 );}else {perror("shmget error ");return -1;}}printf("shm_id = %d\n", shm_id );//3.映射 char * p = shmat( shm_id, NULL, 0 );if( p == NULL ){perror("shmat error ");return -1;}//4.创建一个子进程 pid_t  pid = fork();if( pid > 0 )   //父进程 {//等待子进程退出 wait( NULL );//读取数据,打印printf("father : %s\n", p );//5.解除映射 shmdt( p );}else if( pid == 0 )   //子进程 {//写入数据printf("child : ");fgets( p, 128, stdin );}else {perror("fork error ");shmdt( p );return -1;}}


    4)共享内存的控制操作shmctl 

            NAME
                shmctl - System V shared memory control
            SYNOPSIS
                #include <sys/ipc.h>
                #include <sys/shm.h>

                int shmctl(int shmid, int cmd, struct shmid_ds *buf);
                    功能:对共享内存的其他控制操作
                    参数: 
                        shmid: 共享内存id 
                        cmd: 命令号  
                                IPC_RMID    删除  
                                IPC_STAT    获取属性 
                                IPC_SET     设置属性 
                                ...
                        buf: 结构体指针 , 具体根据cmd的不同,有不同含义 
                                如果 cmd == IPC_RMID ,那么就填 NULL 
                    返回值: 
                        成功,返回0 
                        失败,返回-1,同时errno被设置

             

          struct shmid_ds {struct ipc_perm shm_perm;    /* Ownership and permissions */size_t          shm_segsz;   /* Size of segment (bytes) */time_t          shm_atime;   /* Last attach time */time_t          shm_dtime;   /* Last detach time */time_t          shm_ctime;   /* Last change time */pid_t           shm_cpid;    /* PID of creator */pid_t           shm_lpid;    /* PID of last shmat(2)/shmdt(2) */shmatt_t        shm_nattch;  /* No. of current attaches */...};


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386473.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

phpwamp集成环境中里在php7.1.5下安装php_redis扩展及mysql索引类型和索引方法笔记

一、phpwamp集成环境中里在php7.1.5下安装php_redis扩展 phpwamp集成环境使用起来非常方便&#xff0c;选择要启用的环境启动即可&#xff0c;可以非常方便地在apache,nginx&#xff0c;php各版本之间切换。启动后的界面如下图&#xff0c;不过在使用phpwamp的过程中&#xff0…

C# 6.定时器 timer

使用控件&#xff1a; 开启定时器&#xff1a;timer1.Start(); 关闭定时器&#xff1a;timer1.Stop(); 定时间时间间隔:Interval timer1.Interval 1000; Interva等于1000是每一秒刷新一次 定时器默认时间间隔是100ms 代码创建定时器 ①创建 Timer t1 new Timer(); …

dotnet-starter-kit:一个Web API+Blazor多租户、模块化、简洁DDD架构!

推荐一个Web APIBlazor多租户、模块化、简洁DDD项目框架。 01 项目简介 dotnet-starter-kit是一个基于 .NET 8 的开源项目&#xff0c;架构构建基于 Clean Architecture 原则的解决方案。支持多租户、模块化&#xff0c;一个开箱即用的项目&#xff0c;方便我们快速开发项目。…

lua 游戏架构 之 游戏 AI (八)ai_tbl 行为和优先级

定义一系列的AI行为类型和它们的优先级&#xff0c;以及一个映射表ai_tbl来关联每种AI行为类型与对应的脚本文件和优先级。以下是对代码的详细解释&#xff1a; lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客https://blog.csdn.net/heyuchang666/artic…

【C++题解】1069. 字符图形5-星号梯形

问题&#xff1a;1069. 字符图形5-星号梯形 类型&#xff1a;嵌套循环、图形输出 题目描述&#xff1a; 打印字符图形。 输入&#xff1a; 一个整数&#xff08; 0<n<10 &#xff09;。 输出&#xff1a; 一个字符图形。 样例&#xff1a; 输入&#xff1a; 3输…

【公式解释】《系统论》《控制论》《信息论》的共同重构:探索核心公式与深度解析

《系统论》《控制论》《信息论》的共同重构&#xff1a;探索核心公式与深度解析 关键词&#xff1a;系统论、控制论、信息论、状态空间方程、系统矩阵。 Keywords: System theory, Control theory, Information theory, State-space equations, System matrices. 核心公式与…

访问控制列表(ACL)

文章目录 ACL原理与基本配置ACL分类ACL组成ACL规则的匹配与应用 ACL原理与基本配置 ACL(Access Control List&#xff0c;访问控制列表) 读取二层、三层、四层报文信息根据预先定义好的规则对报文进行过滤和分类实现网络访问控制、防止网络攻击和提高网络带宽利用率等目的提高…

Linux(虚拟机)的介绍

Linux介绍 常见的操作系统 Windows&#xff1a;微软公司开发的一款桌面操作系统&#xff08;闭源系统&#xff09;。版本有dos&#xff0c;win98&#xff0c;win NT&#xff0c;win XP , win7, win vista. win8, win10&#xff0c;win11。服务器操作系统&#xff1a;winserve…

论文阅读【检测】:商汤 ICLR2021 | Deformable DETR

文章目录 论文地址AbstractMotivation技术细节多尺度backbone特征MSDeformAttention 小结 论文地址 Deformable DETR 推荐视频&#xff1a;bilibili Abstract DETR消除对目标检测中许多手工设计的组件的需求&#xff0c;同时表现出良好的性能。然而&#xff0c;由于Transfor…

学习笔记之JAVA篇(0724)

p 方法 方法声明格式&#xff1a; [修饰符1 修饰符2 ...] 返回值类型 方法名&#xff08;形式参数列表&#xff09;{ java语句;......; } 方法调用方式 普通方法对象.方法名&#xff08;实参列表&#xff09;静态方法类名.方法名&#xff08;实参列表&#xff09; 方法的详…

软考:软件设计师 — 7.软件工程

七. 软件工程 1. 软件工程概述 &#xff08;1&#xff09;软件生存周期 &#xff08;2&#xff09;软件过程 软件开发中所遵循的路线图称为 "软件过程"。 针对管理软件开发的整个过程&#xff0c;提出了两个模型&#xff1a;能力成熟度模型&#xff08;CMM&#…

unity2D游戏开发06稳定,材质,碰撞器

稳定性 在操控玩家时,我们会发现玩家移动时,摄像头会有抖动,这是摄像机过度精确造成的。 创建名为RoundCameraPos的C#脚本,用Visual Studio打开 代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using Cinemachine;//导入Cinemac…

DC系列靶场---DC 3靶场的渗透测试(一)

信息收集 Nmap扫描 nmap -sS -sV -T4 -p- -O 172.30.1.142//-sS TCP的SYN扫描 //-sV 服务版本检测 //-T4 野蛮的扫描&#xff08;常用&#xff09; //-O 识别操作系统 使用Nmap扫描只看到一个80端口&#xff0c;Apache的2.4.18版本。 http探测 使用Wappalyzer插件可以到…

SN65MLVD080使用手册

8通道半双工M-LVDS线路收发器 特性 低压差分30欧姆至55欧姆线路驱动器和接收器&#xff0c;支持信号速率高达250 Mbps&#xff1b;时钟频率高达125 MHz 满足或超过M-LVDS标准TIA/EIA-899多点数据交换规范 受控驱动器输出电压转换时间&#xff0c;提高信号质量 -1V至3.4V共模…

QQ微信头像制图工具箱小程序纯前端源码

QQ微信头像制图工具箱小程序纯前端源码&#xff0c;主要功能有文字九格、头像挂件生成、爆趣九宫格、形状九宫格、创意长图、情侣头像、猫狗交流器。 这个QQ微信小程序源码是纯前端的&#xff0c;基本上拿去就可以用&#xff0c;不过好像调用了很多API&#xff0c;由于最近时间…

前端web开发HTML+CSS3+移动web(0基础,超详细)——第1天

一、开发坏境的准备 1&#xff0c;在微软商店下载并安装VS Code 以及谷歌浏览器或者其他浏览器&#xff08;我这里使用的是Microsoft Edge&#xff09; 2&#xff0c;打开vs code &#xff0c;在电脑桌面新建一个文件夹命名为code&#xff0c;将文件夹拖拽到vs code 中的右边…

空气处理机组系统中的设计和选型参考

1、静压的选择&#xff1a; 1.机组所承受的正压值和负压值既不是指机组的机外静压&#xff0c;也不是指风机的压头&#xff0c;而是指机组内部与机组外部大气压的差值&#xff0c;具体的计算方法如下&#xff1a; 如图所示&#xff0c;机组的新、回、送风管阻力分别为A、B、C帕…

【轨物方案】开关柜在线监测物联网解决方案

随着物联网技术的发展&#xff0c;电力设备状态监测技术也得到了迅速发展。传统的电力成套开关柜设备状态监测方法主要采用人工巡检和定期维护的方式&#xff0c;这种方法不仅效率低下&#xff0c;而且难以保证设备的实时性和安全性。因此&#xff0c;基于物联网技术的成套开关…

Qt自定义MessageToast

效果&#xff1a; 文字长度自适应&#xff0c;自动居中到parent&#xff0c;会透明渐变消失。 CustomToast::MessageToast(QS("最多添加50张图片"),this);1. CustomToast.h #pragma once#include <QFrame>class CustomToast : public QFrame {Q_OBJECT pub…

图——“多对多”的逻辑结构

目录 1.什么是图&#xff1f; 图包含&#xff1a; 2.图的基本术语 无向图&#xff1a; 有向图&#xff1a; 权重&#xff1a;边上的数字 度&#xff1a; 邻接点&#xff1a; 完全图&#xff1a; 3.图的抽象数据类型定义 4.怎么在程序中表示一个图&#xff1f; 邻接矩…