有人可以提供一个(合理地)使用具有非空第二个参数的函数 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),然后在尝试访问内存时出现了段错误.