2015-05-25 57 views
6

在C,我可以创建一个共享内存对象:如何使用Haskell的mmap库读取共享内存?

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); 

但我如何访问从哈斯克尔的数据?

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 
+5

根据作者[评论](https://hackage.haskell.org/package/mmap-0.5.9/docs/src/System-IO-MMap.html),它无法做到:“ TODO:支持外部给予的HANDLE和FD“。你必须自己添加功能。 – user2407038

+0

好赶@ user2407038,谢谢! – MaiaVictor

回答

2

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

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

作为另一个选项,如果你不想让自己的FFI绑定,bindings-posix包会为你提供这作为c'mmap

+0

那天我很抱歉没有这样做,我刚刚学习了共享内存,并认为我没有资格实现它。谢谢! – MaiaVictor