2015-05-25 11 views
6

, ben bir paylaşılan bellek nesnesi oluşturabilirnasıl Haskell'ın mmap kitaplığı kullanarak paylaşılan hafızayı okunur? Ben de <code>mmap</code> kullanarak o bellekten okuyabilir</p> <pre><code>int fd = shm_open("/object", O_RDWR | O_CREAT, 0777); </code></pre> <p>: C: Açık

int* addr = mmap(0, sizeof(*addr), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 

Ama Haskell verilerine bunu nasıl ulaşabilirim?

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

Bu yazarlar [yorumların] göre, bunu yapamaz (https://hackage.haskell.org/package/mmap-0.5.9/docs/src/System-IO-MMap.html): " TODO: harici olarak verilen HANDLE ve FD'leri destekleyin ". Fonksiyonu kendiniz eklemeniz gerekecek. – user2407038

+0

İyi yakalamak @ user2407038, teşekkür ederim! – MaiaVictor

cevap

2

O kullandığınız mmap paketi bu işlevi desteklemez anlaşılıyor. Ancak, iyi haber şu ki, istediğiniz şey uygulamak zor değil. Bir yaklaşım sadece ByteString işaretçiyi dönüştürme packCStringLen kullanmak, sonra mmap için bağlayıcı bir ham FFI oluşturmak kendin mmap arama ve etmektir. Eğer bağlayıcı kendi FFI istemiyorsanız, bindings-posix paket c'mmap olarak sizin için bu sağlayacaktır Başka bir seçenek olarak

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

.

+0

O gün bunu yapmayan üzgünüm, sadece paylaşılan bellek öğrenmeye ve bunu uygulamak için nitelikli değildi kabul edildi. Teşekkür ederim! – MaiaVictor

İlgili konular