Shmat与非null shmaddr

时间:2010-02-09 12:52:58

标签: c linux posix shared-memory

有人可以提供(合理地)使用函数shmat()和非空第二个参数的示例吗?

手册说:

  

#include <sys/shm.h>

     

void *shmat(int shmid, const void *shmaddr, int shmflg);

     

shmat()函数将与共享内存标识符shmid关联的共享内存段附加到调用进程的数据段。该段附加在由以下标准之一指定的地址:

     
      
  • 如果shmaddr是一个NULL指针,则该段将附加在系统选择的第一个可用地址上。
  •   
  • 如果shmaddr不是NULL指针且(shmflg&amp; SHM_RND)非零,则该段附加在(shmaddr - (shmaddr%SHMLBA))给出的地址处。
  •   
  • 如果shmaddr不是NULL指针且(shmflg&amp; SHM_RND)为0,则该段将附加到shmaddr给出的地址。
  •   

但我从未见过shmatdr设置为NULL时使用的任何shmat示例。在我的项目中,一个进程必须将它附加到malloc()'ed内存块上就可以了,并且可以正常使用它,然后另一个进程获取指向该共享内存的指针(通过shmid),然后进行segfaulted试图访问内存。

2 个答案:

答案 0 :(得分:3)

这里的想法是将共享段放置在不同进程中的相同虚拟地址,以便它们可以使用普通指针(而不是偏移量)来寻址共享内存中的项目。常见的情况是单个“主”进程在内核提供的地址(第二个参数为零)映射内存,然后通过一些带外通道将该地址传递给“工作”进程(如使用fork / exec,UNIX套接字,FIFO等命令参数,然后“工作人员”尝试在该地址处映射段。同样,我们的想法是,如果内核能够将给定VA的共享内存映射为“master”,那么“worker”进程应该可以使用相同的地址。

我没有一个“合理”的例子来指出。您可以查看Postgres如何使用共享内存。但它有点涉及。

答案 1 :(得分:0)

我想你可以共享一个带有绝对指针的结构。

但我没有任何代码示例。