2011-08-13 21 views
14

कुछ बहुत ही अजीब हो रहा है।मैं कैसे ठीक से अजगर में FIFOs के लिए लिख सकता हूँ? जब मैं लिखने के लिए पायथन में FIFOs (नामित पाइप) खोलने

>>> fifo_write = open('fifo', 'w') 

ऊपर लाइन ब्लॉक जब तक मैं एक और दुभाषिया खोलने के लिए और निम्न लिखें::

>>> fifo_read = open('fifo', 'r') 
>>> fifo.read() 

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

>>> fifo_write.write("some testing data\n") 
>>> fifo_write.flush() 

अपेक्षित व्यवहार है कि दूसरे के व्याख्याता का read करने के लिए कॉल वापस आ जाएगी और हम, स्क्रीन पर डेटा देखेंगे सिवाय इसके कि नहीं है मेरे साथ हो रहा है अगर मैं os.fsync फोन निम्न होता है:

>>> import os 
>>> fifo_write.flush() 
>>> os.fsync(fifo_write.fileno()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OSError: [Errno 22] Invalid argument 

और फीफो पाठक अभी भी इंतज़ार कर रहा है। हालांकि, अगर मैं fifo_writer.close() पर कॉल करता हूं तो डेटा फ़्लश हो जाता है। अगर मैं एक खोल आदेश का उपयोग पाइप को खिलाने के लिए:

$ echo "some data" > fifo 

तो पाठक उत्पादन होता है:

>>> fifo_read.read() 
'some data\n' 

किसी को भी यह अनुभव किया है? यदि ऐसा है तो इसके लिए कोई कामकाज है? मेरा वर्तमान ओएस लिनक्स 2.6.38 के साथ उबंटू 11.04 है।

+1

आप फीफो कैसे बनाया? – OneOfOne

+0

या तो "os.mkfifo ('fifo')" या शैल में "mkfifo fifo" –

+1

'fsync() 'का उपयोग किसी फीफो पर नहीं करता है; डिस्क पर कोई भी डेटा संग्रहित नहीं होता है (बहुत * अजीब परिस्थितियों में स्वैप में * शायद * को छोड़कर)। –

उत्तर

11

read() जब तक यह EOF तक पहुँच जाता है वापस नहीं करता है।

आप बाइट्स आप read(4) की तरह, पढ़ने के लिए चाहते हैं की संख्या निर्दिष्ट करने का प्रयास कर सकते हैं। यह तब भी तब तक अवरुद्ध होगा जब तक कि पर्याप्त बाइट्स लिखे गए हों, इसलिए निर्माता को कम से कम कई बाइट्स लिखना चाहिए और फिर flush() पर कॉल करना होगा।

+0

इसके लिए धन्यवाद, 'रीड' विधि में एक तर्क जोड़ने से समस्या हल हो गई है, फिर भी फ्लश करने की आवश्यकता है .. –

+2

@ थियोडोड अररुडा वास्तव में क्या तर्क है? – n611x007

2

फ्लशिंग के लिए जरूरत से बचने के लिए बफरिंग के बिना फ़ाइल को खोलने:

fifo_read = open('fifo', 'r', 0) 

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

बेशक, आपको शेल पर os.mkfifo() या mkfifo के साथ पहले फीफो बनाया जाना चाहिए था, जैसा आपने टिप्पणी में बताया था।