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 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c语言系统编程十:Linux进程间通信之共享内存 -> 正文阅读

[C++知识库]c语言系统编程十:Linux进程间通信之共享内存

一 共享内存原理

在这里插入图片描述
共享内存允许两个或多个进程共享给定的存储区域。
共享内存的特点:

1. 共享内存是进程间共享数据的一种最快的方法。一个进程向共享内存区域写数据,共享这块内存的所有进程就可以立刻看到这个数据;
2. 使用共享内存要注意的是多个进程之间对一个给定存储区访问的互斥。若一个进程正在向共享内存写数据,则在他做完这步操作前,别的进程不应该去读、写这些数据;
3. 共享内存是系统级别的行为。
共享存储区的最小字节数:1
共享存储区的最大字节数:32M
共享存储区的最大个数:4096
每个进程能最多映射的共享存储区个数:4096

二 共享内存相关API

2.1 获得一个共享存储标识符shmget

  1. 需要的头文件和函数原型
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);

  1. 功能
    创建或打开一块共享内存区

  2. 参数

key:IPC键值
size:该共享内存大小(字节)
shmflg:标识函数行为及共享内存的权限
	IPC_CREAT:如果不存在就创建
	IPC_EXCL:如果已经存在则返回失败
	位或权限位:共享内存位或权限位后可以设置共享内存的访问权限,格式和open函数mode_t一样,但可执行权限未使用
  1. 返回值
成功:返回共享内存标识符
失败:返回-1

2.2 使用shell命令操作共享内存

  1. 查看共享内存ipcs -m
  2. 删除共享内存ipcrm -m shmid

2.3 建立进程的虚拟内存和物理内存的映射函数shmat

  1. 需要的头文件和函数原型
#include <sys/shm.h>

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

  1. 功能
    将一个共享内存段映射到调用进程的数据段中

  2. 参数

shmid:共享内存标识符
shmaddr:共享内存映射地址(若为NULL则由系统指定)
shmflg:共享内存段的访问权限和映射提交
	0:共享内存具有可读可写权限
	SHM_RDONLY:只读
	SHM_RND:(shmaddr非空时才有效)没有指定SHM_RND则此段连接到shmaddr所指定的地址上(shmaddr必须页对齐)。指定了SHM_RND则此段连接到shmaddr-shmaddr%SHMLBA所表示的地址上
  1. 返回值
成功:返回共享内存段映射地址
失败:-1
  1. 注意
    shmat函数使用的时候第二个和第三个参数一般为NULL和0,即系统自动指定共享内存地址,并且共享内存可读可写

2.4 解除共享映射区

  1. 需要的头文件和函数原型
#include <sys/shm.h>

int shmdt(const void *shmaddr);
  1. 功能
    将共享内存和当前进程分离(仅仅是断开联系并不删除共享内存)

  2. 参数

shmaddr:共享内存映射地址
  1. 返回值
成功:0
失败:-1

2.5 共享内存控制

  1. 需要头文件和函数原型
#include <sys/shm.h>

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

  1. 功能
    共享内存空间的控制
  2. 参数
shmid:共享内存标识符
cmd:函数功能控制
	IPC_RMID:删除
	IPC_SET:设置shmid_ds参数
	IPC_STAT:保存shmid_ds参数
	SHM_LOCK:锁定共享内存段(超级用户)
	注意:SHM_LOCK用于锁定内存,禁止内存交换。并不代表共享内存锁定后禁止其他进程访问。其真正意义是:被锁定的内存不允许被交换到虚拟内存中。这样做的优势在于让共享内存一直处于内存中,从而提高程序性能
	SHM_UNLOCK:解锁共享内存段
buf:shmid_ds数据类型的地址,用来存放或修改共享内存的属性
  1. 返回值
成功:0
失败:-1

三 实例

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include <sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>

int main(int argc, char * kwargs[])
{
        //获取唯一key
        key_t key = ftok("/",2222);

        //获取共享内存的标识符(分配物理内存)
        int shm_id = shmget(key, 32, IPC_CREAT|0666);;

        //将虚拟内存和物理内存建立映射
        char *buf = (char *)shmat(shm_id, NULL, 0);

        //操作虚拟内存
        strcpy(buf, "0123456789012345");
        //printf("%s\n",buf);

        //断开映射
        shmdt(buf);
        return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-29 18:48:02  更:2022-06-29 18:50:54 
 
开发: 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年4日历 -2024/4/24 11:20:45-

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