3

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

手册说:

#include <sys/shm.h>

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

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

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

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

4

2 回答 2

3

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

我没有一个“合理”的例子可以指出。你可以看看Postgres如何处理共享内存。虽然有点牵扯。

于 2010-02-09T13:41:05.097 回答
0

我想这是为了让你可以共享一个包含绝对指针的结构。

但我没有任何代码示例。

于 2010-02-09T13:24:17.323 回答