dla przenośnego realizacji, może chcesz użyj biblioteki osicat
, która zapewnia opakowanie CFFI dla wielu wywołań POSIX w pakiecie osicat-posix
.
Istnieje bardzo ładny i krótki artykuł z kodem do używania go pod numerem http://wandrian.net/2012-04-07-1352-mmap-files-in-lisp.html (autor: Nicolas Martyanoff).
Aby zachować, że ja przeważnie cytują stamtąd:
Mapowanie pliku odbywa się poprzez otwarcie go z osicat-posix:open
, czytając jego wielkości z fstat
, następnie wywołanie mmap
. Po zmapowaniu pliku możemy zamknąć deskryptor pliku, nie jest już potrzebny.
(defun mmap-file (path)
(let ((fd (osicat-posix:open path (logior osicat-posix:o-rdonly))))
(unwind-protect
(let* ((size (osicat-posix:stat-size (osicat-posix:fstat fd)))
(addr (osicat-posix:mmap (cffi:null-pointer) size
(logior osicat-posix:prot-read)
(logior osicat-posix:map-private)
fd 0)))
(values addr size))
(osicat-posix:close fd))))
Funkcja mmap plik zwraca dwie wartości: adres mapowania pamięci i jej wielkość.
Odwzorowanie tego fragmentu pamięci odbywa się za pomocą osicat-posix:munmap
.
Dodajmy makro bezpiecznie Mapa i pliki unmap:
(defmacro with-mmapped-file ((file addr size) &body body)
(let ((original-addr (gensym "ADDR-"))
(original-size (gensym "SIZE-")))
`(multiple-value-bind (,addr ,size)
(mmap-file ,file)
(let ((,original-addr ,addr)
(,original-size ,size))
(unwind-protect
(progn ,@body)
(osicat-posix:munmap ,original-addr ,original-size))))))
To makro mmap
s dany plik i wiąże obie zmienne podane na jego adres i i wielkości. Następnie można obliczyć wskaźniki adresu za pomocą cffi:inc-pointer
i uzyskać dostęp do zawartości pliku za pomocą cffi:mem-aref
. Możesz zbudować wokół siebie własne opakowania, aby przedstawić format pliku (np. Zwykły tekst w UTF-8).
(w porównaniu do delegowania połączonego powyżej, usunąłem owijanie osicat-posix:munmap
do innej funkcji dokładnie taki sam podpis i skutku, ponieważ wydawało mi się zbędne.)
Dzięki za odpowiedzi! Oba wydają się rozwiązywać mój problem, więc zamierzam je wypróbować i zaakceptować ten, z którego korzystam. – owagh