如何使用Haskell'读取共享内存;s mmap库?

如何使用Haskell'读取共享内存;s mmap库?,haskell,Haskell,在C上,我可以通过以下方式创建共享内存对象: int fd = shm_open("/object", O_RDWR | O_CREAT, 0777); 我还可以使用mmap从内存中读取: int* addr = mmap(0, sizeof(*addr), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 但是我如何从Haskell获取数据呢 import System.Posix.SharedMem import System.IO.MMap ma

在C上,我可以通过以下方式创建共享内存对象:

int fd = shm_open("/object", O_RDWR | O_CREAT, 0777);
我还可以使用
mmap
从内存中读取:

int* addr = mmap(0, sizeof(*addr), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
但是我如何从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
import System.Posix.SharedMem
导入System.IO.MMap
main=do

fd您正在使用的mmap软件包似乎不支持此功能。然而,好消息是你想要的并不是那么难实现。一种方法是为
mmap
创建原始FFI绑定,自己调用mmap,然后使用
packCStringLen
将指针转换为
ByteString

foreign import ccall "mmap" mmap
  :: Ptr () -> CSize -> CInt -> CInt-> CInt-> Int64 -> IO (Ptr ())

另一种选择是,如果您不想要自己的FFI绑定,那么
bindings posix
包将为您提供这一功能,因为
c'mmap

它无法做到,作者说:“TODO:支持外部给定的句柄和FD”。您必须自己添加功能。很好,谢谢@user2407038!很抱歉那天没有这么做,我只是在学习共享内存,并假设我没有资格实现它。非常感谢。