Linux进程通信之共享内存

news2024/11/24 16:48:42

一、共享内存之原理

1.是在物理内存中开辟了一片空间;

2.不同的进程通过页表将物理内存空间映射到自己的进程虚拟地址空间之中

3.不同的进程可以通过操作自己的虚拟地址空间中的虚拟地址去操作共享内存(物理地址)

共享内存是最快的进程之间的通信方式,所以很多进程之间的通信方式都是用共享内存:eg:守护进程和被守护的进程

二、共享内存的接口

        1.创建、获取共享内存的接口

int shmget(key_t,size_t size, int shmflg)                //shm  shared memory

参数:
key:共享内存的标识符

size:共享内存的大小

shmflg:获取、创建共享内存时所传递的属性信息:

                IPC_CREAT:若获取的共享内存不存在时就创建它

                IPC_EXCL | IPC_CREAT: 若获取的共享内存存在,则函数报错;若获取的共享内存不存在则创建。

                本质上,该组合是要获取重新创建的共享内存

                 按位或上权限

返回值:

        成功:返回共享内存的操作句柄:

       操作共享内存实质就是要操作其句柄

        失败:返回-1;

        2.将共享内存附加到进程的虚拟地址空间

void *shmat(int shmid,const void *shmaddi, int shmflg);

参数:

shmid:共享内存的操作句柄

shmaddr:将共享内存附加到共享区当中的第一个地址,一般让操作系统自己分配,传递NULL

shmflag:用什么权限将共享内存附加到进程中

                SHM_RDONLY:只读

                0:可读可写

 返回值:

                成功:返回附加到的虚拟地址

                失败:-1

        3.分离

int shmdt(const void *shmaddr)

参数:

shmaddr:附加到的虚拟地址(shmat函数执行成功的返回值)

返回值:

成功:0;

失败: -1;

        4.操作共享内存的接口

int  shmctl(int shmid,int cmd,struct shmid_ds *buf)

参数:

shmid:共享内存的操作句柄;

cmd:告诉shmctl函数要完成的功能:
        IPC_SET:设置共享内存属性信息,此时,buf是输入性参数,由程序员组织,传递给shmctl参数

        IPC_STAT:获取共享内存的属性信息,此时,buf是输出型参数,由shmctl函数填充

        IPC_RMID:删除共享内存,此时buf设置为NULL

        buf:共享内存的数据结构

通过IPCS-M查看共享内存:

 利用shmctl删除共享内存:

        

三、共享内存的代码

写入共享内存:

#include<stdio.h>
#include<unistd.h>
#include<sys/shm.h>

int main()
{
  int ret=shmget(0x12345678,1024,IPC_CREAT | 0664);
  if(ret<0)
   {
    perror("shmget \n");
   return 0;
   }

  void *addr=shmat(ret,NULL,0); //得到附加到的虚拟地址
  if(addr==NULL)
  {
    perror("shmat  \n");
   return 0;
  }

  printf("addr=%p\n",addr);
  strcpy((char * )addr,"Love and peace \n" );

  sleep(100);
  shmdt(addr);
return 0;
}

从共享内存中读取:

#include<stdio.h>
#include<unistd.h>
#include<sys/shm.h>

int main()
{
 int shmid=shmget(0x12345678,1024,IPC_CREAT);
 if(shmid<0)
 {
  perror("shmget \n");
 return 0;
 }

 void *addr=shmat(shmid,NULL,SHM_RDONLY);
 if(addr==NULL)
 {
  perror("shmat \n");
 return 0;
 }

 printf("read: %s :  \n",(char *)addr );

 shmdt(addr);
return 0;
}

 

四、共享内存的特性

1.生命周期跟随操作系统

2.共享内存是覆盖写的方式,读取共享内存时,是访问其地址,并没有将数据读取走

3.共享内存的删除特性:
        1 ipcrm -m [shmid]:删除了共享内存

一旦共享内存被删除掉了,共享内存所在物理内存中的空间也同时被销毁了

如果删除的共享内存时,其附加的进程数量为0,则删除后,内核中描述该共享内存的结构体也被释放了。

若删除的共享内存的附加到进程数不为0,则会将该共享内存的key设置为0x00000000,表示该共享内存不可被其他的进程所附加,当附加的进程全部退出时,操作系统会将其在内核中的结构体释放。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么计算机中的负数要用补码表示?

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 前言 大家好&#xff0c;我是小彭。 在前面的文章里&#xff0c;我们聊到了计算机的冯诺依曼架构的 3 个基本原则。其中第 1 个原则是计算机中所有信息都是采用二进制格式的编…

【在Spring MVC框架中,关于限制请求方式】

目录 1.关于限制请求方式 2. 附&#xff1a;关于GET和POST请求方式 1.关于限制请求方式 在Spring MVC框架中&#xff0c;RequestMapping注解的主要作用是配置请求路径&#xff0c;除此以外&#xff0c;还可以配置请求方式&#xff0c;例如&#xff1a; RequestMapping(value…

【Linux常见指令1】

目录&#xff1a;前言常用指令ls指令whoami && pwdcdtouch &#xff08;触摸&#xff09;mkdir &#xff08;make directory&#xff09;rmdir && rm (remove)mv(move 移动)cp(copy 拷贝)stat &#xff08;统计&#xff09;nanoechogccman&#xff08;重要&…

如何在一台服务器同一个端口运行多个pgbouncer

PGbouncer是Postgresql数据库最常用的一款连接池软件&#xff0c;但是它是单进程的&#xff0c;所以只能占用一颗CPU资源&#xff0c;会造成CPU资源的浪费。PGbouncer有方法在同一台服务器的同一个端口运行多个进程实例&#xff0c;可以让资源得到充分利用。 先看下一个pgbounc…

【愚公系列】2022年12月 使用win11系统自带SSH,远程控制VMware中Liunx虚拟机系统

文章目录前言1.cpolar简介2.cpolar功能一、使用win11系统自带SSH&#xff0c;远程控制VMware中Liunx虚拟机系统1.注册cpolar账号2.下载最新版Ubuntu系统3.Ubuntu系统安装curl4.Ubuntu系统安装cpolar5.Ubuntu开启SSH6.WIN11测试SSH总结前言 身为开发人员&#xff0c;虚拟化系统…

Java基础之《netty(6)—NIO快速入门》

一、案例 1、编写一个NIO入门案例&#xff0c;实现服务器端和客户端之间的数据简单通讯&#xff08;非阻塞&#xff09; 2、目的&#xff1a;理解NIO非阻塞网络编程机制 3、代码 NIOServer.java package netty.niostart;import java.io.IOException; import java.net.InetSoc…

死锁问题【javaEE初阶】

什么是死锁&#xff1f; 所谓死锁&#xff0c;是指多个进程在运行过程中因争夺资源而造成的一种僵局&#xff0c;当进程处于这种僵持状态时&#xff0c;若无外力作用&#xff0c;它们都将无法再向前推进。 因此我们举个例子来描述&#xff0c;如果此时有一个线程A&…

【pen200-lab】10.11.1.217

pen200-lab 学习笔记 【pen200-lab】10.11.1.217 &#x1f525;系列专栏&#xff1a;pen200-lab &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月30日&#x1f334; &#x1f36d;作…

node.js的认识与安装

一、node.js的认识 &#x1f4d6; 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个开源的、跨平台的JavaScript 运行时环境。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Google 的 V8 引…

ZMQ之脱机可靠性--巨人模式

当你意识到管家模式是一种非常可靠的消息代理时&#xff0c;你可能会想要使用磁盘做一下消息中转&#xff0c;从而进一步提升可靠性。这种方式虽然在很多企业级消息系统中应用&#xff0c;但我还是有些反对的&#xff0c;原因有&#xff1a; 1、我们可以看到&#xff0c;懒惰海…

【JS】数据结构之栈

文章目录基本介绍代码实现基本介绍 内存中的堆栈和数据机构中的堆栈不是一个概念&#xff0c;内存中的堆栈是真实存在的物理区&#xff0c;数据结构中的堆栈是抽象数据存储结构。 栈&#xff1a;是一种受限制的线性表。他遵循后进先出的原则&#xff08;LIFO&#xff09;其限制…

神仙级编程神器,吹爆

Visual Studio 编程领域公认的“最强IDE”&#xff0c;Visual Studio是目前最流行的Windows平台应用程序的集成开发环境&#xff0c;提供了高级开发工具、调试功能、数据库功能和创新功能&#xff0c;帮助在各种平台上快速创建当前最先进的应用程序&#xff0c;开发新的程序。 …

【ODX介绍】-5-用于Flash刷写的ODX-F文件概述

总目录:(单击下方链接皆可跳转至专栏总目录) 《UDS/OBD诊断需求编辑工具》总目录https://blog.csdn.net/qfmzhu/article/details/123697014 共9页精讲:在第二章节中,附上了一个完整的,且详细的ODX-F文件层级结构图。 目录 1 什么是ODX-F?

【在Spring MVC框架和Spring Boot项目中,控制器的响应结果】

目录 1. 控制器的响应结果 2. 相关配置 3. 使用枚举优化代码 1. 控制器的响应结果 当控制器处理了请求之后&#xff0c;向客户端响应的结果中&#xff0c;应该至少包含&#xff1a; 业务状态码&#xff1a;通常是数值类型的&#xff0c;客户端可以根据此数值来判断操作成功…

docke部署nodejs程序及Dockerfile详解

目录参考一、Dockerfile二、部署1、程序结构2、新建Dockerfile3、新建.dockerignore4、构建镜像5、创建容器6、关闭镜像参考 重点参考&#xff1a;把一个 Node.js web 应用程序给 Docker 化 Docker部署Node.js的方法步骤&#xff08;nodejs docker部署&#xff09; 一、Docke…

Linux服务器启动tomcat的三种方式

直接进入主题&#xff0c;首先cd进入tomcat的bin文件夹下&#xff0c;然后可以尝试以下三种启动方式&#xff1a; 第一种&#xff08;当前会话启动&#xff09;&#xff1a; ./startup.sh 效果: 然后tomcat就在后台启动了&#xff0c;我们还可以在当前会话中继续输入其它指令…

PHP基于thinkphp的网上书店管理系统#毕业设计

本论文主要论述了如何使用php语言开发一个网上图书管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;将论述网上图书管理系统的当前背景以及系统开发的目的&#xff0c;后续章节将严格按照软…

【python】 16进制字符串转list

def splitStringToByteList(bytesString): # 拆分字符串成字节列表bytesList []for i in range(int(len(bytesString)/2)):bytesList.append(bytesString[i*2:i*22])return bytesListif __name__ __main__:print(splitStringToByteList("1E1E2AEB4ACC4C")) 结果&…

shiro key文件

​下面结合实战以及shiro的CookieRememberMeManaer的调用过程,浅谈获取shiro key文件的几种方式。 shiro key文件的获取方式:1结合Dnslog与URLDNS;2利用时间延迟或报错;3结合CookieRememberMeManaer 1结合Dnslog与URLDNS 在进行漏洞探测的时候,一般会使用ysoserial-URL…

Codeforces Round #835 (Div. 4)A.B.C.D.E.F

A. Medium Number 题目链接&#xff1a; Problem - A - Codeforces 题面&#xff1a; 题意&#xff1a; 给定三个数&#xff0c;求中间那个数的值 思路&#xff1a; 我们可以分别求出三个数的总和&#xff0c;最大值和最小值&#xff0c;在通过总和减最大值和最小值的方…