Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 具有非空shmaddr的Shmat_C_Linux_Posix_Shared Memory - Fatal编程技术网

C 具有非空shmaddr的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

有人能提供一个(合理地)使用带有非空第二个参数的函数shmat()的例子吗

手册上说:

#包括

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的相同(已创建)共享内存块。区别在哪里?区别在于,共享内存在所有通信进程中都映射在相同的确切虚拟地址,因此一个进程可以在那里存储指针(当然限于共享段),其他进程可以直接使用它们。