C 具有非空shmaddr的Shmat
有人能提供一个(合理地)使用带有非空第二个参数的函数shmat()的例子吗 手册上说:C 具有非空shmaddr的Shmat,c,linux,posix,shared-memory,C,Linux,Posix,Shared Memory,有人能提供一个(合理地)使用带有非空第二个参数的函数shmat()的例子吗 手册上说: #包括 void*shmat(int-shmid,const-void*shmaddr,int-shmflg) 函数的作用是:将与共享内存标识符shmid关联的共享内存段附加到调用进程的数据段。段附加在以下条件之一指定的地址: 如果shmaddr是空指针,则该段将附加在系统选择的第一个可用地址 如果shmaddr不是空指针且(shmflg&SHM_RND)非零,则段将附加到(shmaddr-(shmaddr
#包括
void*shmat(int-shmid,const-void*shmaddr,int-shmflg)代码>
函数的作用是:将与共享内存标识符shmid关联的共享内存段附加到调用进程的数据段。段附加在以下条件之一指定的地址:
- 如果
shmaddr
是空指针,则该段将附加在系统选择的第一个可用地址
- 如果
shmaddr
不是空指针且(shmflg&SHM_RND)非零,则段将附加到(shmaddr-(shmaddr%SHMLBA))给定的地址
- 如果
shmaddr
不是空指针且(shmflg&SHM_RND)为0,则段将附加到shmaddr给定的地址
但是我从来没有见过任何shmat的例子,除了将shmaddr设置为NULL之外,其他任何东西都可以使用。在我的项目中,一个进程需要将它连接到一个malloc()
”的内存块上,并且可以很好地使用它,然后另一个进程获取了指向该共享内存的指针(通过shmid),然后在尝试访问内存时发生了故障。我想这是为了让您可以共享一个包含绝对指针的结构
但是我没有任何代码示例。这里的想法是将共享段放置在不同进程中的同一虚拟地址,以便它们可以使用普通指针(而不是偏移量)来寻址共享内存中的项。常见的情况是,单个“主”进程将内存映射到内核提供的地址(第二个参数为零),然后通过一些带外通道(如带有fork/exec、UNIX套接字、FIFO等的命令参数)将该地址传递给“工作”进程,然后“工作”进程尝试映射该地址处的段。同样,这个想法是,如果内核能够为“主”映射给定VA的共享内存,那么对于“工作”进程来说,相同的地址就可以了
我没有一个“合理”的例子来说明。您可以看看如何使用共享内存。虽然这有点复杂。…但是如果“工作者”对shmget使用相同的键,他们不需要地址-shmat将返回一个指针,指向shmaddr=NULL的相同(已创建)共享内存块。区别在哪里?区别在于,共享内存在所有通信进程中都映射在相同的确切虚拟地址,因此一个进程可以在那里存储指针(当然限于共享段),其他进程可以直接使用它们。