免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 949 | 回复: 0
打印 上一主题 下一主题

怎样在Linux系统中建立共享内存? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-01 22:42 |只看该作者 |倒序浏览
    在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/
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/35795/showart_1161629.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP