有人可以提供一个示例(合理地)将shmat()函数与第二个非空参数一起使用吗?
该手册说:

但是我从未见过将shmaddr设置为NULL的任何shmat示例。在我的项目中,一个进程必须将它附加到malloc()的一块内存上,并且可以很好地使用它,然后另一个进程(通过shmid)获取了指向该共享内存的指针,然后在尝试访问该共享内存时出现段错误。内存。

最佳答案

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

我没有要指出的“合理”例子。您可以看一下Postgres如何与共享内存一起工作。不过有点涉及。

关于c - Shmat与非null shmaddr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2229088/

10-09 09:17