有人可以提供(合理地)使用函数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试图访问内存。
答案 0 :(得分:3)
这里的想法是将共享段放置在不同进程中的相同虚拟地址,以便它们可以使用普通指针(而不是偏移量)来寻址共享内存中的项目。常见的情况是单个“主”进程在内核提供的地址(第二个参数为零)映射内存,然后通过一些带外通道将该地址传递给“工作”进程(如使用fork / exec,UNIX套接字,FIFO等命令参数,然后“工作人员”尝试在该地址处映射段。同样,我们的想法是,如果内核能够将给定VA的共享内存映射为“master”,那么“worker”进程应该可以使用相同的地址。
我没有一个“合理”的例子来指出。您可以查看Postgres如何使用共享内存。但它有点涉及。
答案 1 :(得分:0)
我想你可以共享一个带有绝对指针的结构。
但我没有任何代码示例。