2011-06-27 20 views
10

क्या गैर अवरोधन/एसिंक्रोनस नामित पाइप या खोल में समान कुछ बनाने का कोई तरीका है? ताकि कार्यक्रम इसमें लाइनें रख सकें, वे लाइनें रैम में रहेंगी, और जब कुछ प्रोग्राम पाइप से कुछ लाइनें पढ़ सकते थे, जबकि इसे फीफो में पढ़ा नहीं गया था? यह भी बहुत संभव है कि कार्यक्रम एक ही समय में इस फीफो को लिख और पढ़ सकते हैं। सबसे पहले मैं शायद यह फाइलों का उपयोग करके किया जा सकता है, लेकिन थोड़ा सा वेब खोजने के बाद ऐसा लगता है कि फ़ाइल को एक ही समय में पढ़ा और लिखा गया है। नामित पाइप लगभग काम करेंगे, केवल दो समस्याएं हैं: पहले अगर वे दूसरे छोर पर कोई नहीं हैं, तो वे पढ़ते हैं/लिखते हैं, दूसरा अगर मैं अवरुद्ध करने के लिए लिखने देता हूं और दो प्रक्रियाओं को पाइप पर लिखने के लिए सेट करता हूं, जबकि कोई भी पढ़ता नहीं है, प्रत्येक प्रक्रिया के साथ एक पंक्ति लिखने की कोशिश करके, और फिर head -n 1 <fifo> आज़माएं, मुझे केवल एक पंक्ति मिलती है जैसा मुझे चाहिए, लेकिन दोनों लेखन प्रक्रियाएं समाप्त हो जाती हैं, और दूसरी पंक्ति खो जाती है। कोई सुझाव?खोल/फाइल सिस्टम में अनब्लॉकिंग/एसिंक्रोनस फीफो/नामित पाइप?

संपादित करें: शायद कुछ इंटरमीडिएट प्रोग्राम का उपयोग लेखकों और पाठकों के बीच मध्यस्थ की तरह अभिनय करने के लिए किया जा सकता है?

+2

(अगर आप चाहते हैं या एक बड़ी संख्या) आप 'एमकेऍफ़एस/dev/ram1 1048576' की तरह कुछ कर सकता है और माउंट'/dev/कहीं भी तो ram1'। यह शायद "नॉनब्लॉकिंग" के करीब है जैसा आप प्राप्त कर सकते हैं। यह निश्चित रूप से डिफ़ॉल्ट रूप से अनब्लॉक नहीं होगा, बस बहुत तेज़ होगा (लेकिन नामित पाइप डिफ़ॉल्ट रूप से नहीं होगा)। नॉनब्लॉकिंग ऑपरेशन ऐसा कुछ है जिसे प्रोग्राम को डिस्क्रिप्टर पर सेट करने की आवश्यकता होती है। – Damon

+0

हालांकि मैं इस विकल्प के बारे में, tmpfs या इसी तरह की फ़ाइल बनाते हैं, लेकिन फिर एक ही समय में लिखने और पढ़ने की समस्या बनी रहती है। इसकी फाइल के बाद लेखन और लेखन की तरह अधिक। एक प्रोग्राम फ़ाइल के अंत में लिखता है, अन्य ने शुरुआत से कुछ जानकारी पढ़ी है और अब पहली लाइनों को हटाने की जरूरत है, इसलिए अंत में लिखना और एक ही समय में सामने हटाना, मुझे इसका समाधान नहीं मिला, मैं इस्तेमाल होता इस। – morphles

+1

प्रोग्राम लिखने के बिना ऐसी चीज करना मुश्किल है (यदि असंभव नहीं है)। कुछ ऐसा हो सकता है जो _almost_ काम कर सकता है: नामकरण परमाणु है, इसलिए प्रत्येक निर्माता प्रत्येक अलग-अलग कार्य को व्यक्तिगत टेम्पफाइल पर लिख सकता है, फ़ाइल बंद कर सकता है और इसे "प्रसिद्ध" पैटर्न के अनुसार नाम बदल सकता है। प्रत्येक उपभोक्ता अगली फ़ाइल को यादृच्छिक रूप से पुनर्नामित कर सकता है (इसलिए कोई अन्य उपभोक्ता इसे नहीं उठाएगा), सामग्री पढ़ें, और फ़ाइल को हटा दें। हालांकि यह केवल प्रति-कार्य स्तर पर काम करेगा (जो भी निर्माता एक इकाई के रूप में लिखते हैं), प्रति पंक्ति स्तर पर नहीं। – Damon

उत्तर

5

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

bzcat archive.bz2 | बफर -एम 16000000-बी 100000 | प्रसंस्करण_स्क्रिप्ट | bzip2>

archive_processed.bz2

http://linux.die.net/man/1/buffer

+0

प्रोग्राम को इंगित करने के लिए धन्यवाद जो मुझे नहीं पता था, दिलचस्प लगता है और कुछ मामलों में उपयोगी हो सकता है। यद्यपि यह वही नहीं था जो मैं चाहता था और मैं जो भी चाहता हूं वह करने में सक्षम नहीं हूं, मैंने फैसला किया है कि सबसे अधिक संभावना है कि मैं अपने जैसे मामलों के लिए अपना खुद का प्रोग्राम/डिमन लागू करूंगा। – morphles

+0

एक और समाधान क्यूई डिमन का उपयोग करना होगा, गियरमैन की तरह कुछ। आपकी "रेखाएं" नौकरियों के रूप में memcache में जारी रह सकती है। –