2014-12-12 6 views
7

जैसा कि सवाल कहता है। मैं दो लिस्पी प्रक्रियाओं के बीच संवाद करने के लिए साझा स्मृति का उपयोग करना चाहता हूं। ऐसा करने के तरीके पर कोई संकेतक?मैं स्मृति को tbfs फ़ाइलों को sbcl में कैसे मैप कर सकता हूं?

मैं कम से clozure में ऐसा करने पर कुछ ट्यूटोरियल देख सकते हैं: -

http://ccl.clozure.com/manual/chapter4.7.html

किसी को एक समान पुस्तकालय SBCL के साथ ऐसा करने के लिए मुझे बात कर सकते हैं?

+0

जवाब के लिए धन्यवाद! वे दोनों मेरी समस्या का समाधान करने लगते हैं, इसलिए मैं उन्हें बाहर करने की कोशिश करने जा रहा हूं और जिसे मैं उपयोग कर रहा हूं उसे स्वीकार करता हूं। – owagh

उत्तर

6

निम्न स्तर के mmap समारोह SBCL के साथ बंडल है:

CL-USER> (apropos "MMAP") 
SB-POSIX:MMAP (fbound) 
; No value 
CL-USER> (describe 'sb-posix:mmap) 
SB-POSIX:MMAP 
[symbol] 

MMAP names a compiled function: 
Lambda-list: (ADDR LENGTH PROT FLAGS FD OFFSET) 
Derived type: (FUNCTION (T T T T T T) 
       (VALUES SYSTEM-AREA-POINTER &OPTIONAL)) 
Inline proclamation: INLINE (inline expansion available) 
Source file: SYS:CONTRIB;SB-POSIX;INTERFACE.LISP.NEWEST 
; No value 

आप इसे उपयोग करने के लिए, सी

9

एक पोर्टेबल कार्यान्वयन के लिए के रूप में स्पष्ट पता 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 की रैपिंग बिल्कुल वैसा ही हस्ताक्षर और प्रभाव का एक और समारोह में हटा दिया, क्योंकि यह मेरे लिए ज़रूरत से ज़्यादा लग रहा था।)

+0

नोट: 'osicat-posix: mmap' विंडोज का समर्थन नहीं करता है। विंडोज़ पर 'CreateFileMapping' है, कृपया एसबीसीएल स्रोत कोड फ़ाइल' src/code/win32.lisp' देखें। – muyinliu

संबंधित मुद्दे