int segment_id = shmget (shm_key, getpagesize (), IPC_CREAT | S_IRUSR| S_IWUSR ); 如果调用成功 , shmget将返回一个共享内存标识符 。如果该共享内存块已经存在 , 系统会检查访问权限 , 同时会检查该内存块是否被标记为等待摧毁状态 。
绑定脱离要让一个进程获取对一块共享内存的访问 , 这个进程必须先调用 shmat(SHared Memory Attach , 绑定到共享内存) 。将 shmget 返回的共享内存标识符 SHMID 传递给这个函数作为第一个参数 。该函数的第二个参数是一个指针 , 指向您希望用于映射该共享内存块的进程内存地址;如果您指定NULL则Linux会自动选择一个合适的地址用于映射 。第三个参数是一个标志位 , 包含了以下选项:
SHM_RND表示第二个参数指定的地址应被向下靠拢到内存页面大小的整数倍 。如果您不指定这个标志 , 您将不得不在调用shmat的时候手工将共享内存块的大小按页面大小对齐 。SHM_RDONLY表示这个内存块将仅允许读取操作而禁止写入 。如果这个函数调用成功则会返回绑定的共享内存块对应的地址 。通过 fork 函数创建的子进程同时继承这些共享内存块;如果需要 , 它们可以主动脱离这些共享内存块 。当一个进程不再使用一个共享内存块的时候应通过调用 shmdt(Shared Memory Detach , 脱离共享内存块)函数与该共享内存块脱离 。将由 shmat 函数返回的地址传递给这个函数 。如果当释放这个内存块的进程是最后一个使用该内存块的进程 , 则这个内存块将被删除 。对 exit 或任何exec族函数的调用都会自动使进程脱离共享内存块 。
控制释放调用 shmctl("Shared Memory Control" , 控制共享内存)函数会返回一个共享内存块的相关信息 。同时 shmctl 允许程序修改这些信息 。该函数的第一个参数是一个共享内存块标识 。
要获取一个共享内存块的相关信息 , 则为该函数传递 IPC_STAT 作为第二个参数 , 同时传递一个指向一个 struct shmid_ds 对象的指针作为第三个参数 。
要删除一个共享内存块 , 则应将 IPC_RMID 作为第二个参数 , 而将 NULL 作为第三个参数 。当最后一个绑定该共享内存块的进程与其脱离时 , 该共享内存块将被删除 。
您应当在结束使用每个共享内存块的时候都使用 shmctl 进行释放 , 以防止超过系统所允许的共享内存块的总数限制 。调用 exit 和 exec 会使进程脱离共享内存块 , 但不会删除这个内存块 。要查看其它有关共享内存块的操作的描述 , 请参考shmctl函数的手册页 。
优点缺点共享内存块提供了在任意数量的进程之间进行高效双向通信的机制 。每个使用者都可以读取写入数据 , 但是所有程序之间必须达成并遵守一定的协议 , 以防止诸如在读取信息之前覆写内存空间等竞争状态的出现 。不幸的是 , Linux无法严格保证提供对共享内存块的独占访问 , 甚至是在您通过使用IPC_PRIVATE创建新的共享内存块的时候也不能保证访问的独占性 。同时 , 多个使用共享内存块的进程之间必须协调使用同一个键值 。

文章插图
【共享内存才是实现进程间通信最简单也是最直接的方法】
推荐阅读
- 谁才是“酱中之王”?黄豆酱、甜面酱、豆瓣酱,网友:它当之无愧
- 老茶收藏需知,只有今天的好茶才是将来的老茶
- 好茶有四个标准 怎样的茶才是最好的呢
- 虚拟内存结构了解一下
- 让小白也能看明白,什么才是专业的家庭影院功放
- PHP内存管理机制与垃圾回收机制
- 怎样喝茶才是最优雅科学的
- 原生态无污染才是真正农家茶
- 智能电视两大系统UI对比,原来系统体验好和无广告才是重中之重
- 手机内存不足怎么破?
