Chinaunix首页 | 论坛 | 博客
  • 博客访问: 504172
  • 博文数量: 76
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1534
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-10 16:28
文章分类
文章存档

2010年(1)

2009年(3)

2008年(72)

我的朋友

分类: LINUX

2008-09-01 22:42:01

    在UNIX通信方式中有一个共享内存,它是一种非常重要的通信方式,速度快效率高。System V 进程间通信(IPC)包括3种机制:消息队列、信号量、共享内存。消息队列和信号量均是内核空间的系统对象,经由它们的数据需要在内核和用户空间进行额外 的数据拷贝;而共享内存和访问它的所有应用程序均同处于用户空间,应用进程可以通过地址映射的方式直接读写内存,从而获得非常高的通信效率。定义共享内存的API接口函数:
# include 
# include
# include

key_t ftok(const char *pathname, int proj_id);
int shmget(key_t key, int size, int shmflg);
void* shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(void *shmaddr);
int shmctl(int shmid, int cmd, struct shmid_ds *buf);

ftok函数用于生成一个键 值:key_t key,该键值将作为共享内存对象的唯一性标识符,并提供给为shmget函数作为其输入参数;ftok 函数的输入参数包括一个文件(或目录)路径名:pathname,以及一个额外的数字:proj_id,其中pathname所指定的文件(或目录)要求 必须已经存在,且proj_id不可为0;
shmget函数用于创建(或者获取)一个由key键值指定的共享内存对象,返回该对象的系统标识符:shmid;
shmat函数用于建立调用进程与由标识符shmid指定的共享内存对象之间的连接;
shmdt函数用于断开调用进程与共享内存对象之间的连接;
shmctl函数用于对已创建的共享内存对象进行查询、设值、删除等操作;

写一个建立共享内存的实例代码:
146 s32 ipc_create_shmem(void)
147 {
148     int shm_id;
149     key_t key;
150
151     /* get gp_setup share memory */
152     key = ftok(SHMEM_SETUP_PATH,1);
153     if(key < 0){
154         err("ftok error: %m\n");
155         return FAILURE;
156     }
157     shm_id=shmget(key,sizeof(struct rpms_setup),IPC_CREAT);
158     if(shm_id < 0) {
159         err("shmget error: %m\n");
160         return FAILURE;
161     }
162     http_setup=(struct rpms_setup *)shmat(shm_id,NULL,SHM_RDONLY);
163     if ((void *)http_setup < (void *)0){
164         err("shmat error:%m\n");
165         http_setup=NULL;
166         return FAILURE;
167     }
168 }
这个只是简单的建立共享内存,至于更加详细的解释在http://www.ibm.com/developerworks/cn/aix/library/au-cn-sharemem/


阅读(2263) | 评论(0) | 转发(0) |
0

上一篇:statfs函数的应用

下一篇:fprintf函数的使用

给主人留下些什么吧!~~