2011-03-03 26 views
1

我正在使用虚拟地址使用shmat()。如何以确保的方式将虚拟地址传递给shmat()函数

  • 所述第一进程调用与shmaddr所一个的shmat为空,并且当它得到的数据的虚拟地址阻止它存储在另一个共享memeory地方。

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

  • 在大多数情况下,第二个进程通常可以附加到相同的虚拟地址,但在一种情况下,我不能和shmat返回-1,并且当我使用gdb时,我看到地址是Bad地址。

    (gdb) x 0x800852000 
    0x800852000: Error accessing memory address 0x800852000: Bad address. 
    

所以我的问题是如何保证在第一时间,我得到这两个 过程可以看到虚拟地址?

回答

1

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

void *stuff = shmat(shmid, 0x0000005000000000, SHM_RDONLY); 
+3

我不得不说,如果你可以让系统选择最好的地址给你(和首选使用共享内存)并使您的代码更加便携。 – 2011-03-04 01:11:06

+1

我想使用固定地址来允许进程通过存储地址来读取特定地址的内容。就像在第一个进程中存储另一个进程可以直接从中读取的地址一样...没有偏移量 – 2011-03-04 22:18:55

+0

如果您更改第一个进程以将shmaddr设置为不太可能使用的地址范围(除非进程变得非常大),那么你的问题应该消失。但是,这样做的时候,除非你完全控制你使用的所有代码和库的功能,否则没有保证。所以,你所能做的就是选择一个不太可能被使用的地址范围。在我们的例子中,0x0000005000000000每次都有效。 – 2011-03-05 10:00:12