2015-05-25 59 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