找回密码
 注册
搜索
热搜: 回贴
微赢网络技术论坛 门户 服务器 Linux/BSD 查看内容

怎样在Linux系统中建立共享内存?

2009-12-20 13:12| 发布者: admin| 查看: 121| 评论: 0|原作者: 冰淇淋

在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/







最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 13:15 , Processed in 0.156691 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部