进程间的通讯方式_共享内存

       共享内存:共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式,它允许两个不相关的进程访问同一个逻辑内存。虽然X/Open标准并没有对它做出要求,但大多数共享内存的具体实现都把由不同进程之间共享的内存安排为同一段物理内存。

       共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是由malloc分配的一样。如果某个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何进程看到。

       共享内存为在多个进程之间共享和传递数据提供了一种有效的方式。由于它并未提供同步机制,所以通常需要用其他的机制来同步对共享内存的访问。我们一般是用共享内存来提供对大块内存区域的有效访问,同时通过传递小消息来同步对该内存的访问。

       共享内存示例图如下:

       共享内存也有内核对象来管理共享的内存区域

       共享内存的特点:共享内存是最快的一种IPC,在各个进程都有指针直接指向开辟内存区域。访问时当作本进程中的一个内存控制直接操作。

       相关操作:

              创建或获取:int shmget((key_t)key, size_t size, int flag);

                                    key:键值

                                    size:开辟共享的内存空间的大小

                                    flag:与IPC_CREAT异或使用,如果存在,则获取;如果不存在,则创建

                                    如果共享内存创建成功,shmget返回一个非负整数(即共享内存标识符);如果失败,就返回-1。

              链接:void *shmat(int shmid, void *addr, int flag);

                         shmid:shmget返回的共享内存标识符

                         addr:指定共享内存连接到当前进程中的地址位置,它通常是一个空指针,表示让系统来选择共享内存出现的地址。

                         如果shmat调用成功,它返回一个指向共享内存的第一个字节的指针;如果失败,它就返回-1。

              断开链接:int shmdt(void *ptr);

                               这个函数的作用是将共享内存从当前进程中分离,它的参数是shmat返回的地址指针。成功时返回为0,失败时返回-1。注意,此函数只完成断开链接操作,并不会删除共享内存(将共享内存分离并删除它,只是使得该共享内存对当前进程不在可用)。

              删除内核对象:int shmctl(int shmid, intcmd, struct shmid_ds *buff);

                                       shmid:shmget返回的共享内存标识符

                                       cmd:要采取的动作,它可以取三个值

                                                  IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值

                                                  IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值

                                                  IPC_RMID:删除共享内存段

                                       shmid_ds结构至少包含以下成员:

                                       struct shmid_ds

                                       {

                                            uid_t shm_perm.uid;

                                            uid_t shm_perm.gid;

                                            mode_t shm_perm.mode;

                                       }                       

猜你喜欢

转载自blog.csdn.net/ylh_yanlinghui/article/details/78796307