博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux进程间通信之共享内存
阅读量:6964 次
发布时间:2019-06-27

本文共 1853 字,大约阅读时间需要 6 分钟。

一,共享内存

  内核管理一片物理内存,允许不同的进程同时映射,多个进程可以映射同一块内存,被多个进程同时映射的物理内存,即共享内存。
  映射物理内存叫挂接,用完以后解除映射叫脱接

1,共享内存的特点:

  优点:是最快的IPC。

  缺点:要编程者自己实现对共享内存互斥访问。如何实现?
2,编程模型:具体函数的用法可以用man手册查看(强力推荐)

进程A: writeshm.c

     1) 获得key, ftok()
     2) 使用key来创建一个共享内存 shmget()
     3) 映射共享内存(得到虚拟地址), shmat()
     4) 使用共享内存, 往共享内存中写入数据
     5) 解除映射 shmdt()
     6) 如果共享内存不再使用,可以使用shmctl()销毁共享内存

 

进程B: readshm.c     

  1) 获得key, ftok()     

  2) 使用key来获得一个共享内存 shmget()     

  3) 映射共享内存(得到虚拟地址), shmat()     

  4) 使用共享内存, 读取共享内存中的数据     

  5) 解除映射 shmdt()     

 

3,实例

进程A:

// writeshm.c#include
#include
#include
#include
#include
#include
int main(){ // 生成一个key key_t key = ftok("./", 66); // 创建共享内存,返回一个id int shmid = shmget(key, 8, IPC_CREAT|0666|IPC_EXCL); if(-1 == shmid) { perror("shmget failed"); exit(1); } // 映射共享内存,得到虚拟地址 void *p = shmat(shmid, 0, 0); if((void*)-1 == p) { perror("shmat failed"); exit(2); } // 写共享内存 int *pp = p; *pp = 0x12345678; *(pp + 1) = 0xffffffff; // 解除映射 if(-1 == shmdt(p)) { perror("shmdt failed"); exit(3); } printf("解除映射成功,点击回车销毁共享内存\n"); getchar(); // 销毁共享内存 if(-1 == shmctl(shmid, IPC_RMID, NULL)) { perror("shmctl failed"); exit(4); } return 0;}

进程B:

// readshm.c#include
#include
#include
#include
#include
#include
int main(){ // 生成一个key key_t key = ftok("./", 66); // 获取共享内存,返回一个id int shmid = shmget(key, 0, 0); if(-1 == shmid) { perror("shmget failed"); exit(1); } // 映射共享内存,得到虚拟地址 void *p = shmat(shmid, 0, 0); if((void*)-1 == p) { perror("shmat failed"); exit(2); } // 读共享内存 int x = *(int *)p; int y = *((int *)p + 1); printf("从共享内存中都取了:0x%x 和 0x%x \n", x, y); // 解除映射 if(-1 == shmdt(p)) { perror("shmdt failed"); exit(3); } return 0;}

 运行结果:

writeshma:

readshma:

转载地址:http://qrwsl.baihongyu.com/

你可能感兴趣的文章
财务企业网银故障快速攻克
查看>>
谭浩强C语言下载
查看>>
我的友情链接
查看>>
weblogic 启动脚本
查看>>
lamp-配置防盗链、访问控制Directory(针对目录)、访问控制(针对单文件)
查看>>
Cacti中文版在Centos上的安装(1)
查看>>
转:路由器MTU值对于网络通讯的影响(解决部分网站打不开问题)
查看>>
状态模式
查看>>
PHP,安卓,ios相互适用的AES加密算法
查看>>
我的友情链接
查看>>
LitePal的使用
查看>>
查找旁站路径的几种方法
查看>>
Cisco路由配置入门
查看>>
图片数据&大文本数据存储
查看>>
我的友情链接
查看>>
创建并调用 DLL(1)
查看>>
lvs+keepalived实现DR模式热备
查看>>
各种媒体数据以 base64 编码方式直接嵌入网页中的写法
查看>>
微软ASP.NET 电商网站开发实战 MVC6 +HTML5 +WCF+WebAPI+NoSQL+mongoDB+Redis+Core视频 代码 面试题...
查看>>
由客户现场引发的思考
查看>>