2012-07-01 23 views
10

में रेफरेंसियल पारदर्शिता और एमएमएपी मैं फ़ाइल संशोधनों को देखने के लिए System.INotify और System.IO.MMap का उपयोग करने की उम्मीद कर रहा था और फिर नेटवर्क पर पैच भेजने के लिए तुरंत भिन्नताएं निष्पादित करता था। हालांकि, System.IO.MMap के लिए दस्तावेज में वहाँ निर्देशात्मक पारदर्शिता के बारे में चेतावनी के एक जोड़े है:हास्केल

प्रलेखन राज्यों

यह एक फ़ाइल mmap अगर आप जानते हैं कि आप एकमात्र उपयोगकर्ता हैं केवल सुरक्षित है। अन्यथा संदर्भित पारदर्शिता हो सकती है या समझौता नहीं किया जा सकता है। अफसोस की बात है ऑपरेटिंग सिस्टम ऑपरेटिंग सिस्टम के बीच बहुत अलग है।

मानों mmap रिटर्न IO ByteString कर रहे हैं, निश्चित रूप से, जब मैं putStr साथ इस मान का उपयोग मैं एक अलग परिणाम हर बार उम्मीद कर रहा हूँ? मुझे लगता है कि लेखक का मतलब है कि आईओ ऑपरेशन के दौरान मूल्य putStr और क्रैश के दौरान बदल सकता है?

स्टार्ट-के-संपादित करें: यह सोचने के लिए आओ, मुझे लगता है कि प्रश्न के इस हिस्से का जवाब कुछ हद तक स्पष्ट है ... मूल्य किसी भी समय बदल जाता है के बाद यह अनबॉक्स्ड है यह समस्याग्रस्त हो जाएगा।

do 
    v <- mappedValue :: IO ByteString 
    putStr v 
    putStr v -- Expects the same value of v everywhere 

अंत संपादित

नहीं यह मैप किया क्षेत्र पर या फ़ाइल पर ताला किसी तरह का अधिग्रहण करने के लिए संभव हो सकता है?

वैकल्पिक रूप से, क्या एक समारोह copy :: IO ByteString -> IO ByteString लिखना संभव होगा जो फ़ाइल को अपने वर्तमान स्थिति में एक सुरक्षित तरीके से स्नैपशॉट लेता है?

+0

मुझे लगता है कि आप जो चाहते हैं उसे पाइप की एक साधारण जोड़ी के साथ किया जा सकता है। – leftaroundabout

+0

मैं कुछ हद तक सामान्य रूप से निर्देशिका में फ़ाइलों को "देख रहा हूं"। यदि कोई उपकरण उन्हें छूता है, तो क्लाइंट स्वचालित रूप से अपडेट हो जाते हैं। –

+1

क्या वास्तव में कोई mmap लाइब्रेरी नहीं है जो 'IO (Ptr Word8)' या इसी तरह की कुछ प्रकार प्रदान करती है? –

उत्तर

8

मुझे लगता है कि लेखक का मतलब है कि मूल्य एक उठाए गए फ़ंक्शन के अंदर भी बदल सकता है जो इसे सादा ByteString (कोई आईओ) के रूप में देख सकता है।

मेरी मैप फ़ाइल मेमोरी का एक क्षेत्र है। प्रदर्शन कारणों के लिए, इसकी सामग्री को प्रतिलिपि बनाने के लिए यह अधिक समझ में नहीं आता है (अन्यथा कोई केवल पुराने पुराने स्ट्रीम-आधारित I/O कर सकता है)। तो आप जो बाइटस्ट्रिंग प्राप्त कर रहे हैं वह लाइव है।

यदि आप स्नैपशॉट चाहते हैं, तो बस स्ट्रीम-आधारित I/O का उपयोग करें। फ़ाइल को पढ़ने के लिए यही है: स्मृति में एक फ़ाइल स्नैपशॉट बनाता है! मुझे लगता है कि एक विकल्प ForeignPtr इंटरफ़ेस का उपयोग करेगा जो संदर्भित पारदर्शिता चेतावनी नहीं लेता है। मैं विदेशी लोगों से परिचित नहीं हूं इसलिए मैं गारंटी नहीं दे सकता कि यह काम करेगा, लेकिन यह आशाजनक लग रहा है और मैं इसकी जांच करूंगा।

आप अपने बाइटस्ट्रिंग पर map id पर भी कॉल करने का प्रयास कर सकते हैं लेकिन इसकी गारंटी नहीं है कि आपको मूल से एक प्रतिलिपि मिल जाएगी।

अनिवार्य फ़ाइल लॉकिंग, विशेष रूप से लिनक्स पर, एक गड़बड़ है जो बेहतर से बचा जाता है। सलाहकार फ़ाइल लॉकिंग ठीक है, सिवाय इसके कि कोई भी इसका उपयोग नहीं कर रहा है, इसलिए यह प्रभावी रूप से मौजूद नहीं है।

+2

में विदेशी पीआरटी सामग्री का उपयोग करने के समान भी हो सकता है, मुझे लगता है कि अवचेतन रूप से मैं ' मैं अपने ऑपरेटिंग सिस्टम से थोड़ा अधिक उम्मीद कर रहा हूँ। मैं मूल रूप से, कई प्रक्रियाओं के बीच वास्तव में तेजी से साझा-मेमोरी कैश की तरह फ़ाइल का इलाज करना चाहता था, जिससे ओएस इच्छा पर डिस्क में फ्लशिंग परिवर्तनों का ख्याल रखता था। इसके बारे में अधिक सावधानी से सोचते हुए मुझे लगता है कि काम करने की काफी संभावना नहीं है जब तक कि सभी प्रक्रियाएं स्पष्ट रूप से साझा स्मृति मानचित्र का उपयोग न करें। –

+0

(देखें, मुझे भौतिक डिस्क को छूने में शामिल विलंबता से बचने की उम्मीद है ...) –