获取只读mmap对象的地址

shu*_*e87 5 python mmap python-3.x

我目前正在处理一些代码这些代码在使用mmap对象的进程之间共享一些状态。用例是一堆进程,这些进程可以访问共享的mmap支持的阵列中的某些只读数据。其中一部分涉及对基础内存表示进行一些算术运算,我正在使用ctypes 来获取基础内存地址,就像在这个问题中一样。

我有一种情况,希望能够打开此mmap文件,使其仅由仅读取数据的进程读取。但是,当我这样做时,我不确定在这种情况下如何获取指针地址。以下是我所能解决的最接近此问题的最小示例:

import mmap
import ctypes

filename = "test"

with open(filename, 'rb+') as fd:
    buf = mmap.mmap(fd.fileno(), 0)
    int_pointer = ctypes.c_int.from_buffer(buf)

with open(filename, 'rb') as fd:
    test_mmap_ro = mmap.mmap(
        fd.fileno(), 0, access=mmap.ACCESS_READ,
        )
    int_pointer2 = ctypes.c_int.from_buffer(test_mmap_ro) #fails here
Run Code Online (Sandbox Code Playgroud)

在Python3上运行,此操作将失败:

TypeError: must be read-write buffer, not mmap.mmap
Run Code Online (Sandbox Code Playgroud)

尽管Python2给出了这一点:

TypeError: mmap can't modify a readonly memory map.
Run Code Online (Sandbox Code Playgroud)

鉴于我实际上想使用只读内存映射,我该怎么做?如果需要的话,我将更改为可写的mmap,但是如果有另一种方法可以,则我不希望这样做,因此,任何建议或解决方法都将不胜感激。

shu*_*e87 5

Using ctypes I ended up with this:

obj = ctypes.py_object(buf)
address = ctypes.c_void_p()
length = ctypes.c_ssize_t()
ctypes.pythonapi.PyObject_AsReadBuffer(obj, ctypes.byref(address), ctypes.byref(length))
int_pointer = address.value
Run Code Online (Sandbox Code Playgroud)