在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
答案 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}}为您提供。