linux之System V共享内存




                                          共享内存
    共享内存是系统创建的特殊地址空间,允许不相关的多个进程使用这个内存空间,即多个进程能够使用同一块内存中的数据。

    共享内存与其他进程通信方式相比较,不需要复制数据,直接读写内存,是一种效率非常高的进程通信方案。但它本身不提供同步访问机制,需要我们自己控制。在LINUX中,只要把共享内存段连接到进程的地址空间中,这个进程就可以访问共享内存中的地址了。

    LINUX系统提供的共享内存操作函数与信号量、消息队列等类似,主要有以下几个:
  (1) int shmget(key_t key,int shmsz,int shmflg);
  (2) void *shmat(int shmid,const void *shmaddr, int shmflg);
   如果shmaddr为0 则此段连接到由内核选择的第一个可用地址上,这是推荐的使用方式
   如果shmaddr非零,并且没有指定SHM_RND,则此段链接到addr所指的地址上
   如果shmaddr非零且指定SHM_RND,则此段链接到shmaddr - (addr mod ulus SHMLBA)所表示的地址上。SHM_RND的意思是低边界地址倍数,它总是2的乘方。该算式是将地址向下取最近的一个SHMLBA的倍数
  (3) int shmdt (const void *shmaddr);
  (4) int shmctl(int shmid, int cmd,struct shmid_ds *buf);

以上各函数含义如下:
 Shmget()函数分配一块新的共享内存。Shmsz指明共享内存的大小,以字节为单位,shmflg的设置与信号量的semget()函数中的参数semflg类似。
如果shmget()函数调用成功则返回共享内存的ID;否则返回-1.

 Shmat()函数的作用是连接共享内存与某个进程的地址空间。Shmid是shmget()函数返回的共享内存ID。Shmaddr是共享内存连接到进程中的存放地址,一般设置为空指针,表示交由系统完成这个工作。Shmflg设置共享内存的控制选项,有两个可能取值:SHM_RND(与shmaddr参数相关)与SHM_RDONLY(只允许读)。如果shmat()函数调用成功则返回指向共享内存的指针;否则返回-1.

 Shmdt()函数用来解除进程与共享内存区域的关联,使当前进程不能继续访问共享内存。参数shmaddr是shmat()函数返回的指针。如果操作成功则返回0;失败则返回-1.

 Shmctl()函数实现对共享内存区域的控制操作。其用法与消息队列的msgctl()函数类似。

猜你喜欢

转载自blog.csdn.net/dDANGHUAN/article/details/79933427