2013-08-08 3 views
13

हास्केल हैंडल का उपयोग करते समय मुझे थोड़ा असुरक्षित महसूस हुआ। अर्थात्, मैं दो विशेषताओं की तलाश में हूं (शायद वे पहले से ही हैं और उस मामले में कृपया मेरी अज्ञानता को क्षमा करें)।हास्केल में सुरक्षित हैंडल?

  1. जब मैं एक संभाल प्राप्त कर लिया है (जैसे, Network.accept द्वारा दिया) है, जो दोनों पठनीय और लिखने योग्य है, मैं उन्हें की एक जोड़ी में तब्दील करना चाहते हैं केवल पढ़ने के लिए और लिखने केवल ऐसा लगता है कि केवल पढ़ने के लिए हैंडल को लिखना चेक टाइप नहीं करेगा और इसके विपरीत। (शायद एक आईओ कार्यों के आसपास इस प्रेत प्रकार और wraps का उपयोग कर प्राप्त कर सकते हैं?)
  2. एक समवर्ती की स्थापना में, मैंने पाया है कि यह एक ही संभाल, जो जन्म देता है पर लिखने के लिए से अधिक थ्रेड के लिए संभव है काफी बुरा परिणाम । किसी प्रकार को सिस्टम सिस्टम (यदि संभव हो) के माध्यम से कैसे रोक सकता है या कम से कम रन-टाइम के दौरान फेंक दिया अपवाद के माध्यम से इस तरह के मामले को अधिसूचित किया जा सकता है?

कोई भी विचार स्वागत है।

उत्तर

2

आप network conduit पैकेज का उपयोग करने पर विचार करना चाह सकते हैं।

type Application m = AppData m -> m() 

data AppData m Source -- ... 
appSource :: AppData m -> Source m ByteStringSource 
appSink :: AppData m -> Sink ByteString m() 

इस सफाई से लेखन और पढ़ने भाग को अलग करती है: एक सिंक एक सॉकेट में डेटा धक्का और एक स्रोत है कि सॉकेट से डेटा पढ़ता है - यह कुछ है कि दो "अंतिम बिंदु" दिया जाता है के रूप में एक नेटवर्क आवेदन वर्णन करता है। अब आप इस तरह के स्रोत और सिंक के साथ जो भी चाहें कर सकते हैं, यहां तक ​​कि प्रत्येक को एक अलग थ्रेड और प्रोसेसिंग इनपुट और आउटपुट को अलग से भी पास कर सकते हैं। बेशक, उनमें से प्रत्येक केवल उस बिंदु के आधार पर पढ़ या लिख ​​सकता है, जो आप इसे देते हैं।

यदि आप सिंगल-थ्रेडेड प्रोसेसिंग को लागू करना चाहते हैं, तो आप Conduit ByteString m ByteString के रूप में अपने प्रोग्राम घटकों को लागू करने के लिए स्वयं को प्रतिबंधित कर सकते हैं। इस तरह की एक नाली aseily

asApp :: MonadIO m => Conduit ByteString m ByteString -> Application m 
asApp cond ad = appSource ad $= cond $$ appSink ad 

की तरह एक Application रों में बदल सकता है लेकिन एक नाली केवल await का उपयोग कर डेटा और yield का उपयोग कर उत्पादन लिखने का अनुरोध कर सकते हैं, अन्यथा हैंडल के किसी भी प्रकार के लिए कोई पहुँच गया है और कभी नहीं अपने अंतिम बिंदु के किसी भी देखता है , इसलिए यह कहीं भी उन्हें बेनकाब या रिसाव नहीं कर सकता है।

8

ऐसा लगता है कि safer-file-handles लाइब्रेरी आप जो चाहते हैं वह करता है। पहला भाग बहुत स्पष्ट रूप से संभाला जाता है। regions लाइब्रेरी से RegionT द्वारा समेकन-सुरक्षा को संभाला जा रहा है। मैंने इसका बिल्कुल उपयोग नहीं किया है, लेकिन यह एक बहुत ही आम दृष्टिकोण की तरह दिखता है।

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