概念:共享内存是进程间通信(IPC)中最简单的方式之一,也是最快的IPC形式。共享内存允许两个或多个进程访问同一块内存。当一个进程改变了这块内存中的内容的时候,其他进程就可以察觉到这种更改。一旦这样的内存映射到共享它的进程的地址空间,这些进程间的数据传递将不再涉及到内核,即进程不再通过执行进入内核的系统调用来传递数据,而是这些进程通过共享内存来传递数据。

共享内存的实现步骤:
1.创建共享内存区,通过shmget实现。在物理内存中开辟一块共享内存区。
2.把这块共享内存区挂接映射到两个进程的地址空间上,通过shmat实现。
3.完成通信之后,撤销内存映射关系,通过shmdt进行脱离。
4.删除共享内存区,通过shmctl实现。

共享内存的特性:
共享内存是最快的进程间通信的方案。不管是管道还是消息队列都必须把用户数据拷贝至内核,然后接收方再从内核中拷进来。共要进行两次拷贝,而共享内存一旦映射成功,一个进程向共享内存区写入了数据,其他共享这个内存的所有进程就能立刻看到其中的内容。
共享内存没有提供同步与互斥的机制。这部分的功能需要自己完成。若一个进程正在想共享内存区中写数据,则在它做完这一步的操作前,别的进程不应该去读或者写数据。

函数原型:
int shmget(key_t key, size_t size, int shmflg);
参数: 
key:进程间通信的键值,ftok的返回值
size:共享内存的大小
shmflg:标识函数的行为及共享内存的权限。取值如下:
        IPC_CREAT:如果不存在就创建共享内存
        IPC_EXCL:和IPC_CREAT搭配使用,如果已经存在,则返回失败
        权限位:设置共享内存的访问权限
返回值:成功返回一个非负整数,即共享内存的标识符;失败返回-1

函数原型:
    void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:
    shmid:共享内存标识符,shmget的返回值
    shmaddr:指定映射地址(若为NULL,则由系统自动指定)
    shmflg:共享内存的访问权限和映射条件(通常为0),取值如下:
            0:共享内存具有可读可写权限
            SHM_RDONLY:映射的内存只读
返回值: 成功返回一个指针,指向共享内存第一个节;失败返回-1

函数原型:
    int shmdt(const void *shmaddr);
参数:
    shmaddr: 由shmat所返回的指针
返回值:成功返回0;失败返回-1

函数原型:       
    int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:
    shmid:由shmget返回的共享内存的标识码
    cmd:将要采取的动作,有如下取值:
        IPC_RMID:删除共享内存
        IPC_SET:在进程有足够权限的前提下,把共享内存的当前关联值设置为shmid_ds数据结构中给出的值
        IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值
        SHM_LOCK:锁定共享内存段(超级用户)
        SHM_UNLOCK:解锁共享内存段
    buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0;失败返回-1

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/shm.h>int main()
{//合成键printf("%d进程:合成键\n",getpid());key_t key = ftok(".",100);if(key == -1){perror("ftok");return -1;}//获取共享内存printf("%d进程:获取共享内存\n",getpid());int shm_id = shmget(key,0,0);if(shm_id == -1){perror("shmget");return -1;}//加载共享内存printf("%d进程:加载共享内存\n",getpid());void* shm_addr = shmat(shm_id,NULL,0);if(shm_addr == (void*)-1){perror("shmat");return -1;}//读取共享内存printf("%d进程:读取共享内存\n",getpid());getchar();printf("%s\n",(char*)shm_addr);//卸载共享内存printf("%d进程:卸载共享内存\n",getpid());if(shmdt(shm_addr) == -1){perror("shmdt");return -1;}return 0;
}124657进程:合成键
124657进程:创建共享内存
124657进程:加载共享内存
124657进程:写入共享内存
124657进程:卸载共享内存
124657进程:销毁共享内存
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/shm.h>int main()
{//合成键printf("%d进程:合成键\n",getpid());key_t key = ftok(".",100);if(key == -1){perror("ftok");return -1;}//获取共享内存printf("%d进程:获取共享内存\n",getpid());int shm_id = shmget(key,0,0);if(shm_id == -1){perror("shmget");return -1;}//加载共享内存printf("%d进程:加载共享内存\n",getpid());void* shm_addr = shmat(shm_id,NULL,0);if(shm_addr == (void*)-1){perror("shmat");return -1;}//读取共享内存printf("%d进程:读取共享内存\n",getpid());getchar();printf("%s\n",(char*)shm_addr);//卸载共享内存printf("%d进程:卸载共享内存\n",getpid());if(shmdt(shm_addr) == -1){perror("shmdt");return -1;}return 0;
}124658进程:合成键
124658进程:获取共享内存
124658进程:加载共享内存
124658进程:读取共享内存key=0X64012653,shm_id=4685841,pid=124657
124658进程:卸载共享内存

进程间通信————共享内存相关推荐

  1. 操作系统实验报告7:进程间通信—共享内存。实现一个带有n个单元的线性表的并发维护。

    操作系统实验报告7 实验内容 实验内容:进程间通信-共享内存.实现一个带有n个单元的线性表的并发维护. 建立一个足够大的共享内存空间(lock, M),逻辑值lock用来保证同一时间只有一个进程进入M ...

  2. 操作系统实验报告6:进程间通信—共享内存

    操作系统实验报告6 实验内容 实验内容:进程间通信-共享内存. (1).验证:编译运行课件 Lecture 08 例程代码: Linux 系统调用示例 reader-writer 问题:Algorit ...

  3. C# 进程间通信(共享内存)

    原文:C# 进程间通信(共享内存) 进程间通信的方式有很多,常用的方式有: 1.共享内存(内存映射文件,共享内存DLL). 2.命名管道和匿名管道. 3.发送消息 本文是记录共享内存的方式进行进程间通 ...

  4. Linux基础入门--进程间通信--共享内存

    Linux基础入门--进程间通信--共享内存 1.共享内存IPC原理 2.共享内存管理 1.共享内存IPC原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,共享内存是在内存单独开辟的一段内 ...

  5. Linux下进程间通信--共享内存:最快的进程间通信方式

    内存共享最新整理: Linux下进程间通信-共享内存 - 码到城攻共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式https://www.codecomeon.com/posts/109/ ...

  6. 【Linux】Linux进程间通信——共享内存/消息队列/守护进程

    文章目录 进程间通信--共享内存/守护进程 一, 共享内存 1. 共享内存概念 2. 共享内存使用 1. 共享内存使用步骤 2. 共享内存操作函数 3. 共享内存常用操作命令 4. 共享内存使用示例: ...

  7. 【Linux系统编程】进程间通信--共享内存

    概述 共享内存是进程间通信中最简单的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时 ...

  8. Linux系统【五】进程间通信-共享内存mmap

    mmap函数 #include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags,int fd, ...

  9. c++ fork 进程时 共享内存_c/c++ Linux 进程间通信------共享内存

    1. 什么是共享内存 共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是 ...

  10. 【Linux】进程间通信-共享内存

    前言 我们知道,在Linux中,进程是相互独立存在的,不存在直接让进程之间互相通信的方式.但是如果我们能让不同进程之间见到同一块内存,也就是都能读写这片区域是不是就能够达到进程间通信呢? 事实证明确实 ...

最新文章

  1. 解析软件测试需要变革的因素
  2. kafka-manager安装
  3. ubuntu14 + nginx + php
  4. 机器学习基础-神经网络-10
  5. 帧同步_帧同步和状态同步该怎么选(上)
  6. LeetCode 2012. 数组美丽值求和
  7. LeetCode 1730. 获取食物的最短路径(BFS)
  8. R语言第九讲 验证集法
  9. 5招训练你的数据敏感度,数据高手都在用
  10. 二叉树中最大的二叉搜索子树
  11. wordpress用cdn_如何为WordPress创建自己的自托管CDN
  12. 计算机专业使用的工具,电子投标工具使用手册计算机软件及应用it计算机专业资料.doc...
  13. 吴恩达深度学习——自然语言处理与词嵌入
  14. python爬斗鱼直播房间名和主播名_谁才是斗鱼一哥?(用Python抓取斗鱼直播间信息)...
  15. 计算机绘图AUTOcad2007证要考吗,计算机绘图和 与考证(AutoCAD2005).ppt
  16. php poedit怎么debug,Cakephp的国际化和poEdit的使用
  17. hypermedia_Hypermedia REST API简介
  18. 地铁 综合监控设备 及其所属子系统
  19. 【良心推荐两款软件】eDiary记笔记软件+截图识别文字软件
  20. 微信小程序wxml如何判断字符串中汉语某字符_微信小程序开发经典案例解析“嗨兔儿”...

热门文章

  1. 【转载】文本自动生成研究进展与趋势
  2. 学习笔记04_软件测试过程
  3. bim 导入unity_技术操作:BIM导入unity (VR操作)
  4. 并行编程——OpenMP
  5. python通过调用百度api实现语音识别(超详细)
  6. CVPR2021 | 视觉推理解释框架VRX:用结构化视觉概念作为解释网络推理逻辑的「语言」
  7. 文章内容中表格宽度超过内容区自动在外层添加div和样式并在电脑端可滑动浏览
  8. GitHub怎么用 GitHub是什么 新手怎么用GitHub 图文并茂,不看都不行
  9. 【Redis】缓存雪崩、缓存穿透、缓存击穿
  10. 枪出惊龙,众“锁”周之