Linux程序设计——共享内存
共享内存共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制。共享内存原理:共享内存可以通过mmap()系统调用(特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V共享内存机制实现。应用接口和原理很简单,内部机制复杂。为了实现更安全通信,往往还与信号灯等同步机制共同使用。常用函数 :系统V共享内存系统V共享内存指的是把所有共享数据放
·
共享内存
共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制。
共享内存原理:
共享内存可以通过mmap()系统调用(特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V共享内存机制实现。应用接口和原理很简单,内部机制复杂。为了实现更安全通信,往往还与信号灯等同步机制共同使用。
常用函数 :
系统V共享内存
系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面。
系统V共享内存是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信。
- 系统V共享内存中的数据,从来不写入到实际磁盘文件中去;而通过mmap()映射普通文件实现的共享内存通信可以指定何时将数据写入磁盘文件中。
- 系统V共享内存是随内核持续的,即使所有访问共享内存的进程都已经正常终止,共享内存区仍然存在(除非显式删除共享内存),在内核重新引导之前,对该共享内存区域的任何改写操作都将一直保留。
- 通过调用mmap()映射普通文件进行进程间通信时,一定要注意考虑进程何时终止对通信的影响。而通过系统V共享内存实现通信的进程则不然。
实例
/*7-11.c 程序:匿名内存映射*/
#include<sys/types.h> /*文件预处理,包含waitpid、kill、raise 等函数库*/
#include<unistd.h> /*文件预处理,包含进程控制函数库*/
#include <sys/mman.h>
#include <fcntl.h>
typedef struct /*结构体,定义一个people 数据结构*/
{
char name[4];
int age;
}people;
main(int argc, char** argv) /*C 程序的主函数,开始入口*/
{
pid_t result;
int i;
people *p_map;
char temp;
p_map=(people*)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS,-1,0); /*调用mmap 函数,匿名内存映射*/
result=fork(); /*调用fork 函数,复制进程,返回值存在变量result 中*/
if(result<0) /*通过result 的值来判断fork 函数的返回情况,这儿进行出错处理*/
{
perror("创建子进程失败");
exit(0);
}
else if (result==0) /*返回值为0 代表子进程*/
{
sleep(2);
for(i = 0;i<5;i++)
printf("子进程读取: 第 %d 个人的年龄是: %d\n",i+1,(*(p_map+i)).age);
(*p_map).age = 110;
munmap(p_map,sizeof(people)*10); /*解除内存映射关系*/
exit(0);
}
else /*返回值大于0 代表父进程*/
{
temp = 'a';
for(i = 0;i<5;i++)
{
temp += 1;
memcpy((*(p_map+i)).name, &temp,2);
(*(p_map+i)).age=20+i;
}
sleep(5);
printf( "父进程读取: 五个人的年龄和是: %d\n",(*p_map).age );
printf("解除内存映射……\n");
munmap(p_map,sizeof(people)*10);
printf("解除内存映射成功!\n");
}
}
更多推荐
已为社区贡献2条内容
所有评论(0)