32位和64位进程之间共享的共享内存段

4

是否可能创建一个共享内存段,可以被32位和64位进程访问。使用标志“TPF_IPC64”来支持64位寻址如下:

shmget(key,100,IPC_CREAT|TPF_IPC64);

这个能从32位Linux进程访问吗?
编辑:看起来' TPF_IPC64 '标志在普通Linux OS调用shmget时不受支持。我认为这是IBM的一些专有内容(我的错)。我从这里获取了它:http://pic.dhe.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=%2Fcom.ibm.ztpf-ztpfdf.doc_put.cur%2Fgtpc2%2Fcpp_shmget.html
2个回答

4

man shmget(2)

如果shmflg中设置了IPC_CREAT,则创建的共享内存段只能由相同可执行文件类型的进程共享。也就是说,编译为32位进程的应用程序将能够与其他32位进程共享相同的内存段,而编译为64位进程的应用程序将能够与其他64位进程共享相同的内存段。如果64位进程想要创建一个共享内存段,这个内存段还可以与32位进程共享,那么64位进程必须除了在shmflg中指定IPC_CREAT外,还要指定IPC_SHARE32。而32位进程不需要指定IPC_SHARE32。在基于Itanium(R)平台上,如果正在使用自适应地址空间功能,则可能适用其他规则。请参见下面关于自适应地址空间的部分。


我在我的shmget手册中没有看到这个。而且IPC_SHARE32也没有被识别。我在一些HP文档中找到了这个。你能给我更多关于如何使用它的细节吗? - Nuetrino
我在您提供的链接中找不到IPC_SHARE32。 - Nuetrino
看起来这只支持HP-Ux,这是惠普公司对Unix的专有实现。 - Nuetrino

0

来自IBM的文档

TPF_IPC64 指定支持64位寻址。如果指定此标志,则在有足够堆空间的情况下,将使用64位系统堆来满足请求。如果没有64位系统堆空间可用,则将使用31位系统堆。仅在此共享内存区域的所有用户都支持64位地址时才指定此标志。

最后一句提到了所有进程都必须支持64位地址。因此,32位地址的进程无法访问它。

但是,如果您尝试使用32位进程访问它,我不知道会发生什么行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接