共享内存
2015-06-06 11:34
253 查看
在头文件定义一个全局变量int a,当两个程序同时包含这个头文件时,只是说明他们不需要再次定义a,并不表明他们共享一个变量a,因为对于不同的进程,会分配不同的地址存放a。所以在A程序中对a作出修改,B中并不会有相应变化,此时,就要用到共享内存。
共享内存,是在物理地址分配一块内存,然后分别映射到两个进程的地址空间,于是A进程对于这块内存的操作,会影响到B进程。
general.h
a.c
如图可见,当使用相同的键值时,会得到同一个标识符,即指向同一块物理内存。
共享内存,是在物理地址分配一块内存,然后分别映射到两个进程的地址空间,于是A进程对于这块内存的操作,会影响到B进程。
general.h
typedef struct shamem { int a; } shamem; int shmid;
a.c
#include <stdio.h> #include <sys/shm.h> #include "general.h" int main() { void *shm = NULL; shamem *mem; //用键值123创建共享内存,大小为sizeof(shamem),0666是权限,IPC_CREAT表示新建 shmid = shmget(123, sizeof(shamem), 0666 | IPC_CREAT); //将创建的物理内存映射到进程内存 shm = shmat(shmid, 0, 0); printf("shmid is %d\n", shmid); //根据需要的类型进行类型转换 mem = (shamem *)shm; mem->a = 8; return 0; }b.c
#include <stdio.h> #include <sys/shm.h> #include "general.h" int main() { void *shm = NULL; shamem *mem; //用键值123创建共享内存(和a.c中使用相同的键值,从而指向同一块内存),大小为sizeof(shamem),0666是权限,IPC_CREAT表示新建 shmid = shmget(123, sizeof(shamem), 0666 | IPC_CREAT); //将创建的物理内存映射到进程内存 shm = shmat(shmid, 0, 0); printf("shmid is %d\n", shmid); //根据需要的类型进行类型转换 mem = (shamem *)shm; printf("%d\n", mem->a); return 0; }
如图可见,当使用相同的键值时,会得到同一个标识符,即指向同一块物理内存。
相关文章推荐
- OpenStack Live Migration (转)
- 浅析extendedLayout, automaticallyAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars
- 使用tar进行打包时,发现报了‘从成员名中删除开头的“/”’的错误
- 简介JavaScript中search()方法的使用
- 为什么男女搭配干活不累?
- 输入输出之File类的使用(一)
- 求两个字符串的最大公共子串
- 设计模式之单体模式
- libxml2 使用教程
- 导入library时报错
- Android 使用动态库或静态库来编译生成动态库(转)
- NYOJ 5 Binary String Matching (kmp 字符串匹配)
- MyBatis学习总结(五)——实现关联表查询
- String、StringBuilder、 StringBuffer 深入分析 源码解析
- 排序算法之(2)——选择排序
- java 连接 mysql 的 步骤
- XML技术概览
- HMM-鲍姆-韦尔奇算法
- 发现一只野生无知的小宾
- strcmp 的实现方法