如何使用Haskell的mmap库读取共享内存?

时间:2015-05-25 22:14:06

标签: 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

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

1 个答案:

答案 0 :(得分:2)

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

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

作为另一种选择,如果您不想要自己的FFI绑定,bindings-posix包将以[{1}}为您提供。