如何使用Haskell'读取共享内存;s mmap库?
在C上,我可以通过以下方式创建共享内存对象:如何使用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
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!很抱歉那天没有这么做,我只是在学习共享内存,并假设我没有资格实现它。非常感谢。