Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 如何保证将虚拟地址传递给shmat()函数_C_Shared Memory - Fatal编程技术网

C 如何保证将虚拟地址传递给shmat()函数

C 如何保证将虚拟地址传递给shmat()函数,c,shared-memory,C,Shared Memory,我通过使用虚拟地址来使用shmat() 第一个进程调用shmaddr为null的shmat,当它获取数据块的虚拟地址时,它将存储在另一个共享内存位置 第二个进程使用第一个进程存储在共享memeory中的virtaul地址调用shmat() 在大多数情况下,第二个进程通常可以附加到同一个虚拟地址,但在一个情况下,我无法附加,并且shmat返回-1,当我使用gdb时,我发现该地址是一个错误的地址 (gdb) x 0x800852000 0x800852000: Error accessing

我通过使用虚拟地址来使用shmat()

  • 第一个进程调用shmaddr为null的shmat,当它获取数据块的虚拟地址时,它将存储在另一个共享内存位置

  • 第二个进程使用第一个进程存储在共享memeory中的virtaul地址调用shmat()

  • 在大多数情况下,第二个进程通常可以附加到同一个虚拟地址,但在一个情况下,我无法附加,并且shmat返回-1,当我使用gdb时,我发现该地址是一个错误的地址

    (gdb) x 0x800852000
    0x800852000:    Error accessing memory address 0x800852000: Bad address.
    
所以我的问题是,我如何保证在第一次获得虚拟地址时
进程可以看到?

在设置虚拟地址的情况下,如果强制将其设置为不太可能正常使用的值,效果会更好。你很可能是因为图书馆或其他东西在你有机会连接之前接管了你的地址。我们有一个类似的情况,我们强制我们的地址为0x0000005000000000(对于64位系统):


在设置虚拟地址的情况下,如果将其强制为不太可能正常使用的值,效果会更好。你很可能是因为图书馆或其他东西在你有机会连接之前接管了你的地址。我们有一个类似的情况,我们强制我们的地址为0x0000005000000000(对于64位系统):


我必须说,如果您可以让系统为您选择地址,它会更好(以及共享内存的首选用法),并使您的代码更具可移植性。我想使用固定地址,通过存储地址,允许两个进程读取特定地址的内容。正如在第一个进程中存储另一个进程可以直接从中读取的地址一样……如果您将第一个进程更改为将shmaddr设置为不太可能使用的地址范围(除非进程变得非常大),那么您的问题应该会消失。但是,当这样做时,除非您完全控制您使用的所有代码和库所做的事情,否则没有任何保证。所以,您所能做的就是选择一个不太可能被使用的地址范围。在我们的例子中,0x0000005000000000每次都能工作。Misk您能更深入地了解为什么这个特定的地址在几乎所有的工作负载下都能工作吗?有联系吗?主要是尝试/错误和有根据的猜测。这可能取决于操作系统的版本等(因此它不可移植)。请尝试对感兴趣的进程的进程id进行pmap,以查看操作系统如何映射所有内存段。然后,您必须选择一个有效且不太可能自动选择的段。我必须说,如果您可以让系统为您选择地址,它会更好(以及共享内存的首选用法)我想使用固定地址来允许两个进程通过存储地址来读取特定地址的内容。正如在第一个进程中存储另一个进程可以直接从中读取的地址一样……如果您将第一个进程更改为将shmaddr设置为不太可能使用的地址范围(除非进程变得非常大),那么您的问题应该会消失。但是,当这样做时,除非您完全控制您使用的所有代码和库所做的事情,否则没有任何保证。所以,您所能做的就是选择一个不太可能被使用的地址范围。在我们的例子中,0x0000005000000000每次都能工作。Misk您能更深入地了解为什么这个特定的地址在几乎所有的工作负载下都能工作吗?有联系吗?主要是尝试/错误和有根据的猜测。这可能取决于操作系统的版本等(因此它不可移植)。请尝试对感兴趣的进程的进程id进行pmap,以查看操作系统如何映射所有内存段。然后,您必须选择一个有效且不太可能自动选择的段。
void *stuff = shmat(shmid, 0x0000005000000000, SHM_RDONLY);