在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/ |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏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.