Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251514
  • 博文数量: 52
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-24 07:45
个人简介

生活就像海洋,只有意志坚强的人,才能到达彼岸。

文章存档

2013年(52)

分类: LINUX

2013-09-24 20:03:10

4.1、共享内存概述
共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,需要任何数据的拷贝。为了在多个进程间交换信息,内核专门留出了一块内存区,这段内存区可以由需要访问的进程将其映射到自己的私有地址空间。因此,进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大的提高了效率。当然,由于多个进程共享一段内存,因此需要依靠某种同步机制,如互斥锁和信号量等。器原理图如下所示:
4.2、共享内存的实现
1、函数说明
共享内存的实现分为两个步骤,第一步是创建共享内存,这里用到的函数是shmget,也就是从内存中获得一段共享内存区域。第二步映射共享内存,也就是把这段创建的共享内存映射到具体的进程空间中去,这里使用的函数是shmat。到这里,就可以使用这段共享内存了,也就是可以使用不带缓冲的I/O读写命令进行操作。除此之外,当然还要撤销映射的操作,其函数为shmdt。
2、函数格式
shmget函数:
所需头文件:#incldue #include #include
函数原型:int shmget(key_t key,int size, int shmflg)
参数: key:IPC_PRIVATE
size:共享内存区大小
shmflg:同open函数的权位,也可以用八进制表示法
返回值: 成功:共享内存段标识,出错:-1
shmat函数:
所需头文件:#incldue #include #include
函数原型:char *shmat(int shmid,const void *shmaddr,int shmflg)
参数:shmid:要映射的共享内存区标示符
shmaddr:将要共享内存映射到指定位置(若为0则表示把这段共享内存映射到调用进程的地址空间)
shmaddr:SHM_RDONLY:共享内存只读;默认0:共享内存可读写
返回值:成功:被映射的段地址
出错: -1
shmdt函数:
所需头文件:#incldue #include #include
函数原型:int shmdt(const void shmaddr)
参数:shmaddt:被映射的共享内存的段地址
返回值:成功:0 失败: -1

3、使用实例:

        该实例说明了如何使用基本的共享内存函数,首先是创建一个共享内存区,之后将其映射到本进程汇总,最后再解除这种映射关系。这里介绍了一个命令ipcs,这是用于报告进程间通信机制状态的命令。它可以查看共享内存、消息队列等各种进程通信机制的情况,这里使用了system函数用于调用shell命令"ipcs"命令。程序源代码如下:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFSZ 2048
int main()
{
int shmid;
char *shmadd;

/*创建共享内存*/
if((shmid=shmget(IPC_PRIVATE,BUFSZ,0666))<0){
perror("shmget");
exit(1);
}
else
printf("created shared_memory: %d\n",shmid);
system("ipcs -m");

/*映射共享内存*/
if((shmadd = shmat(shmid,0,0))<(char *)0){
perror("shmat");
exit(1);

}
else
printf("attached shated_memory\n");
/*显示系统内存*/
system("ipcs -m");

/*删除共享内存*/
if((shmdt(shmadd))<0){
perror("shmdt");
exit(1);
}
else
printf("deleted shated_memory\n");
system("ipcs -m");
exit(0);
}
阅读(2527) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~