Miałem nadzieję, że użyję razem System.INotify i System.IO.MMap w celu oglądania modyfikacji plików, a następnie szybkiego wykonywania różnic dla wysyłania łatek przez sieć. Jednak w dokumentacji System.IO.MMap istnieje kilka ostrzeżeń dotyczących przejrzystości referencyjnym:Przejrzysta przezroczystość i mmap w Haskell
Dokumentacja stwierdza
Jest tylko bezpieczne mmap pliku, jeśli wiesz, że jesteś jedynym użytkownikiem. W przeciwnym razie przejrzystość referencyjna może być lub nie może być zagrożona. Niestety semantyka różni się znacznie pomiędzy systemami operacyjnymi.
Wartości, które mmap Powroty IO ByteString
, z pewnością, gdy używam tej wartości z putStr
Czekam inny wynik za każdym razem? Zakładam, że autor oznacza, że wartość może się zmienić podczas operacji IO, takiej jak putStr
i awarii?
START-EDYCJA: Przyjdź, pomyśl o tym, myślę, że odpowiedź na tę część pytania jest nieco oczywista ... Jeśli wartość zmieni się w dowolnym momencie po jej rozpakowaniu, będzie to problematyczne.
do
v <- mappedValue :: IO ByteString
putStr v
putStr v -- Expects the same value of v everywhere
END-OF-Edit
Nie powinno to być możliwe, aby zdobyć jakąś blokadę na wyznaczonej regionu lub pliku?
Czy możliwe jest napisanie funkcji copy :: IO ByteString -> IO ByteString
, która przechwyci migawkę pliku w jego bieżącym stanie w bezpieczny sposób?
Brzmi jak to, co chcesz, można zrobić również z prostą parą rur. – leftaroundabout
Jestem "oglądanie" plików w katalogu w nieco ogólny sposób. Jeśli którekolwiek narzędzie dotknie ich, klienci zostaną automatycznie zaktualizowani. –
Czy naprawdę nie ma biblioteki mmap, która oferuje coś typu 'IO (Ptr Word8)' lub podobne? –