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