एक पोर्टेबल कार्यान्वयन के लिए के रूप में स्पष्ट पता arithmetics उपयोग करने के लिए है, तो आप कर सकते हैं osicat
लाइब्रेरी का उपयोग करें, जो osicat-posix
पैकेज में कई POSIX कॉल के लिए एक CFFI wrapper प्रदान करता है।
http://wandrian.net/2012-04-07-1352-mmap-files-in-lisp.html (निकोलस मार्टिनॉफ द्वारा) पर इसका उपयोग करने के लिए कोड के साथ एक बहुत अच्छा और संक्षिप्त लेख है।
कि संरक्षित करने के लिए, मैं ज्यादातर वहां से अदालत में तलब:
एक फ़ाइल का मिलान osicat-posix:open
साथ इसे खोलने, fstat
साथ इसके आकार को पढ़ने, तो mmap
फोन करके किया जाता है। एक बार फ़ाइल मैप किए जाने के बाद हम फ़ाइल डिस्क्रिप्टर को बंद कर सकते हैं, इसकी अब आवश्यकता नहीं है।
(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))))
mmap-फ़ाइल समारोह दो मानों रिटर्न: स्मृति मानचित्रण और इसका आकार का पता।
स्मृति के इस खंड को अनमैपिंग osicat-posix:munmap
के साथ किया जाता है।
के एक मैक्रो सुरक्षित रूप से मैप करने के लिए और 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))))))
इस मैक्रो mmap
रों दिया फ़ाइल और बांधता है इसका पता और और आकार के दिए गए दो चर। फिर आप cffi:inc-pointer
के साथ पता पॉइंटर्स की गणना कर सकते हैं और cffi:mem-aref
के साथ फ़ाइल सामग्री तक पहुंच सकते हैं। आप अपनी फ़ाइल के प्रारूप (यूटीएफ -8 में ई जी सादा पाठ) का प्रतिनिधित्व करने के लिए इसके चारों ओर अपने स्वयं के रैपर बनाना चाहते हैं।
(पोस्टिंग ऊपर लिंक की तुलना में, मैं osicat-posix:munmap
की रैपिंग बिल्कुल वैसा ही हस्ताक्षर और प्रभाव का एक और समारोह में हटा दिया, क्योंकि यह मेरे लिए ज़रूरत से ज़्यादा लग रहा था।)
जवाब के लिए धन्यवाद! वे दोनों मेरी समस्या का समाधान करने लगते हैं, इसलिए मैं उन्हें बाहर करने की कोशिश करने जा रहा हूं और जिसे मैं उपयोग कर रहा हूं उसे स्वीकार करता हूं। – owagh