一、什么是system V共享内存

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到
内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据


当两个进程在物理内存中开辟同一块i空间,并且映射到两个进程的地址空间的共享内存中,两个进程就能建立通信
当一个进程往里面写入数据,那一个进程直接就能看到。中间没有缓冲区的作用。

创建共享内存时操作系统提供的

共享内存函数

#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok( const char * pathname , int proj_id );
参数:
pathname 就时你指定的文件名(该文件必须是存在而且可以访问的),id是子序号,虽 然为int,但是只有8个比特被使用(0-255)。
返回值: 成功时候返回key_t 类型的key值,失败返回-1
函数ftok把一个已存在的路径名和一个整数标识得转换成一个key_t值

IPC(共享内存)资源随内核,如果不释放,就一直存在。

功能:用来创建共享内存
原型
int shmget(key_t key, size_t size, int shmflg);
参数
key:这个共享内存段名字
size:共享内存大小
shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该共享内存段的标识码(使用户层面的,而key值时操作系统层面依赖标识共享内存的);失败返回-1
shmflg主要和一些标志有关。其中有效的包括IPC_CREAT和IPC_EXCL,它们的功能与open()的O_CREAT和O_EXCL相当。
IPC_CREAT 如果共享内存不存在,则创建一个共享内存,否则打开操作。
IPC_EXCL 只有在共享内存不存在的时候,新的共享内存才建立,否则就产生错误。

如果单独使用IPC_CREAT ,shmget()函数要么返回一个已经存在的共享内存的操作符 ,要么返回一个新建的共享内存的标识符 。
如果将 IPC_CREAT和IPC_EXCL标志一起使用,shmget()将返回一个新建的共享内存的标识符;如果该共享内存已存在,或者返回-1

功能:用于控制共享内存
原型
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数
shmid:由shmget返回的共享内存标识码
cmd:将要采取的动作(有三个可取值)
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构,一般为NULL
返回值:成功返回0;失败返回-1

功能:将共享内存段连接到进程地址空间
原型
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数
shmid: 共享内存标识
shmaddr:指定连接的地址
shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1
说明:
shmaddr为NULL,核心自动选择一个地址
shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址。
shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。公式:shmaddr -
(shmaddr % SHMLBA)
shmflg=SHM_RDONLY,表示连接操作用来只读共享内存

共享内存底层不提供任何同步互斥的机制

#include<iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/shm.h>
using namespace std;
int main(){key_t k=ftok("./",0x666666);
cout<<"k"<<k<<endl;
int shat=shmget(k,4096,IPC_CREAT|IPC_EXCL|0666);//创建共享内存
if(shat<0){cout<<"share 创建失败!"<<endl;
return  1;
}//jianl
//建立宿舍关系
char *str=(char*)shmat(shat,NULL,0);
while(1){sleep(1);
cout<<str<<endl;
}
shmdt(str);
shmat(shat,IPC_RMID,NULL);//删除共享内存
return 0;
}
#include<iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/shm.h>
using namespace std;
int main(){key_t k=ftok("./",0x666666);
cout<<"k"<<k<<endl;
int shat=shmget(k,4096,IPC_CREAT|IPC_EXCL|0666);//创建共享内存
if(shat<0){cout<<"share 创建失败!"<<endl;
return  1;
}       //jianl
//建立宿舍关系
char *str=(char*)shmat(shat,NULL,0);
while(1){sleep(1);
cout<<str<<endl;
}
shmdt(str);
shmat(shat,IPC_RMID,NULL);//删除共享内存
return 0;
}

ipcrm -m 688145 #删除shm ipc资源,注意,不是必须通过手动来删除,这里只为演示相关指令,删除IPC资源是进
程该做的事情

共享内存没有进行同步与互斥!

【校招 --阶段一 系统编程】system V共享内存相关推荐

  1. 嵌入式Linux系统编程学习之二十三 System V 共享内存机制

    文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言   共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...

  2. Linux进程间通信一 System V 共享内存简介与示例

    目录 1. System V共享内存简介 2. API介绍 2.0 key_t和标识符 2.1  创建system v共享内存 2.2 映射共享内存并使用 2.3 取消共享内存映射 2.4 控制共享内 ...

  3. 【Linux】进程间通信 - 匿名/命名管道与System V共享内存

    目录 前言 一.管道 0.什么是管道 1).管道的概念 2).管道的本质 3).管道指令: "|" 1.匿名管道 1).如何创建匿名管道 2).如何使用匿名管道进行通信 3).匿名 ...

  4. 【Linux篇】第十二篇——进程间通信(管道+system V共享内存)

    进程间通信介绍 概念 目的 本质 分类 管道 什么是管道 匿名管道 匿名管道的原理 pipe函数 匿名管道使用步骤 管道读写规则 管道的特点 管道的大小 命名管道 命名管道的原理 使用命令创建命名管道 ...

  5. mmap内存映射、system V共享内存和Posix共享内存

    linux内核支持多种共享内存方式,如mmap内存映射,Posix共享内存,以system V共享内存.当内核空间和用户空间存在大量数据交互时,共享内存映射就成了这种情况下的不二选择.它能够最大限度的 ...

  6. 阐述linux IPC(五岁以下儿童):system V共享内存

    [版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途]         system V共享内存和posix ...

  7. 共享内存之——system V共享内存

    System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...

  8. linux环型共享内存,Linux system v 共享内存

    system v 共享内存 #include #include int shmget(key_t key, size_t size, int shmflg); 建立:进程与共享内存的关联关系 key_ ...

  9. Linux IPC实践(9) --System V共享内存

    共享内存API #include <sys/ipc.h> #include <sys/shm.h>int shmget(key_t key, size_t size, int ...

最新文章

  1. iis7下站点日志默认位置
  2. 跟着“路线图”,我们一起遨游机器学习的世界!
  3. opnet中的例子模型
  4. ML之FE:数据处理—特征工程的简介、使用方法、案例应用之详细攻略
  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)
  6. 驱动思想之机制和策略
  7. python web开发 JavaScript基础
  8. day63-webservice 08.在web项目中配置带有接口的webservice服务
  9. linux 启动nacos报错_Spring Cloud:Alibaba 之 Nacos
  10. win11壁纸|windows11桌面壁纸
  11. python中字符串以什么结尾_python判断字符串以什么结尾的实例方法
  12. 今天把中国建设银行APP4.2.1版iOS客户端里所有的功能都点了一遍
  13. 433MHZ LORA扩频模块于PDA的完美结合
  14. NOIp2010 机器翻译
  15. KST-51:从999999开始的倒计时程序,只显示有效位
  16. Web前端开发有哪些岗位职责 要掌握什么技能
  17. [转]UserData使用总结 - lanyu
  18. 用tig来查看git log
  19. Viper快速配置与上手
  20. basler相机出现buffer不足的解决方案

热门文章

  1. 利用电子计算机处理数字化的影像信息,影像诊断习题题库适合复习考试使用
  2. 安全事件日志中的事件编号与描述
  3. batman-adv中OGM学习包代码处理流程
  4. 如何辨别真假IPHONE4 , IPHONE 4S ?
  5. 113.输入10个国家的名字,按由小到大排序
  6. 中国分电器及点火线圈市场现状研究分析与发展前景预测报告(2022)
  7. 百万级 QPS 业务新宠,金山办公携手 Apache APISIX 打造网关实践新体验
  8. 微信小程序之自定义组件的使用、介绍、案例分享
  9. 算法学习之Trie树
  10. matlab while 嵌套,MATLAB嵌套循环