2015-05-25 1 views
6

Na C, można utworzyć obiekt udostępniony z pamięci:Jak odczytać pamięć współdzieloną za pomocą biblioteki mmap Haskella?

int fd = shm_open("/object", O_RDWR | O_CREAT, 0777); 

mogę również odczytać z tej pamięci z wykorzystaniem mmap:

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

Ale w jaki sposób mogę uzyskać dostęp do zgromadzonych danych z 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 
+5

Nie może tego zrobić, według autorów [comments] (https://hackage.haskell.org/package/mmap-0.5.9/docs/src/System-IO-MMap.html): " TODO: obsługuje zewnętrznie dane UCHWYTY i FD ". Musisz sam dodać tę funkcję. – user2407038

+0

Dobry połów @ user2407038, dziękuję! – MaiaVictor

Odpowiedz

2

Wygląda na to, że pakiet mmap, którego używasz, nie obsługuje tej funkcji. Jednak dobrą wiadomością jest to, że to, czego chcesz, nie jest trudne do wdrożenia. Jednym z nich jest utworzenie surowego powiązania FFI dla mmap, wywołanie mmap, a następnie użycie packCStringLen do konwersji wskaźnika na ByteString.

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

Jako inną opcję, jeśli nie chcesz własną FFI wiążący, pakiet bindings-posix zapewni to dla ciebie jak c'mmap.

+0

Przykro mi, że tego dnia nie robiłem, dopiero poznałem pamięć współdzieloną i założyłem, że nie mam kwalifikacji do jej wdrożenia. Dziękuję Ci! – MaiaVictor