在C上,我可以创建一个共享内存对象:
int fd = shm_open("/object", O_RDWR | O_CREAT, 0777);
Run Code Online (Sandbox Code Playgroud)
我还可以使用mmap
以下内容从该内存中读取:
int* addr = mmap(0, sizeof(*addr), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
Run Code Online (Sandbox Code Playgroud)
但是如何从Haskell访问该数据?
import System.Posix.SharedMem
import System.IO.MMap
main = do
fd <- shmOpen "/bolts" (ShmOpenFlags False False False False) 0777
-- Obviously doesn't make sense, mmapFileByteString
-- requires a file path that I don't have!
addr <- mmapFileByteString "/bolts" Nothing
print addr
Run Code Online (Sandbox Code Playgroud)
您使用的 mmap 包似乎不支持此功能。然而,好消息是,你想要的并不难实现。一种方法是为 创建原始 FFI 绑定mmap
,自己调用 mmap,然后使用packCStringLen
将指针转换为ByteString
.
foreign import ccall "mmap" mmap
:: Ptr () -> CSize -> CInt -> CInt-> CInt-> Int64 -> IO (Ptr ())
Run Code Online (Sandbox Code Playgroud)
作为另一种选择,如果您不想要自己的 FFI 绑定,该bindings-posix
软件包将为您提供c'mmap
.