IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 共享内存(二)—— 共享内存实现不同进程间通信 -> 正文阅读

[系统运维]共享内存(二)—— 共享内存实现不同进程间通信

共享内存(一)—— 共享内存的创建与释放_abs(ln(1+NaN))的博客-CSDN博客介绍共享内存的定义,及其共享内存的创建函数和释放函数https://blog.csdn.net/challenglistic/article/details/124362340?spm=1001.2014.3001.5501在创建好共享内存以后,我们需要让进程挂接到这块共享内存上通信,涉及到的系统调用是 shmat(挂接)、shmdt(断连),最后会结合之前的所有内容测试服务端和客户端的通信


目录

一、shmat函数(shared memory attach)

1、参数解析

2、返回值解析

二、shmdt函数(shared memory detach)

三、共享内存实现不同进程间通信

1、服务端

2、客户端

3、客户端和服务端通信测试

四、共享内存的特性


一、shmat函数(shared memory attach)

这个函数的作用是将进程挂接到共享内存上。

使用shmget创建或者使用共享内存的时候,都会有一个key值,这个key值会被保存在共享内存的结构体中,进程会带着key值去和所有的共享内存中的key值比对,如果一致,则连接。下面这个是用户层的共享内存结构体信息(内核层的结构体虽然有区别,但是大体都一样)

?

1、参数解析

下面是挂接函数的函数声明及需要的头文件

第一个参数,当前进程要挂接的共享内存的ID

第二个参数,手动指定要挂接的共享内存的地址。一般设置为NULL,表示让OS自己决定

第三个参数,挂接以后允许的操作。比如只读只写等,一般是设置为0

2、返回值解析

成功时,返回当前进程挂接到的共享内存的首地址;失败时返回 -1。类似于malloc函数,如果在堆上开辟空间成功,则返回堆上开辟空间的首地址

二、shmdt函数(shared memory detach)

这个函数的作用是断开当前进程和共享内存之间的连接

参数是当前进程连接的共享内存的地址

返回值:成功返回0,失败返回 -1

三、共享内存实现不同进程间通信

下面我们就接续上一次的内容,实现服务端和客户端之间的通信

1、服务端

服务端包含的内容是创建共享内存、连接共享内存、从共享内存中读取内容、断开联系、释放内存

2、客户端

客户端包含的内容是 使用已经存在的共享内存、连接共享内存、向共享内存中写入内容、断开联系、释放内存

要连接共享内存,就需要知道共享内存的ID——》共享内存的ID需要经过shmget获得,但是shmget既可以创建共享内存,也可以使用共享内存,并获取共享内存的ID ——》shmget的第三个参数是IPC_CREAT,表示当共享内存已经存在时,直接使用这块共享内存

3、客户端和服务端通信测试

一开始只运行服务端,但不运行客户端,我们会发现服务端一直在打印,并不像之前的命名管道,会等待另一个进程的输入,所以共享内存不存在同步机制!!

现在我们开始运行客户端,客户端向共享内存里写入数据,服务端就会打印相应的内容

四、共享内存的特性

第一,共享内存的生命周期是随内核的。当通信的两个进程退出以后,共享内存依然存在,只有当OS关闭或者调用系统函数shmctl,共享内存才会被释放

第二,共享内存不存在同步或者互斥机制,数据安全要自己维护。服务端运行的时候,会立即开始打印,也就是读取,但是读取到的为空,所以直接打印空,根本不会等待另一个进程的输入。

第三,通过共享内存通信的方式是目前进程间通信最快的。之前的read或者write函数的本质都是将数据从内核拷贝到用户,或者将数据从用户拷贝到内核——》但是共享内存无需这么复杂,进程创建并连接到共享内存,进程的地址空间中就会有这块内存的虚拟地址,我们可以把这个地址当作指针使用,直接写入数据即可!!

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:16:02  更:2022-04-26 12:19:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:04:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码