2012-03-30 17 views
6

मेरे पास एक परिदृश्य है जहां मैंने दो बच्चे और माता-पिता के बीच संचार के लिए पाइप बनाया है। अभिभावक पाइप को डेटा लिखते हैं (लिखने के फ़ंक्शन का उपयोग करते हैं) और संबंधित फ़ाइल डिस्क्रिप्टर को बंद कर देते हैं। समस्या यह है कि जब मैं पाइप को फिर से डेटा लिखना चाहता हूं, तो लिखने का कार्य त्रुटि कोड -1 लौटा रहा है। मुझे ऐसा लगता है क्योंकि लेखन के अंत पिछले पुनरावृत्ति में बंद कर दिया गया है। फिर एक बार बंद होने के बाद संबंधित फ़ाइल डिस्क्रिप्टर को कैसे खोलें।एक बंद फ़ाइल डिस्क्रिप्टर को फिर से खोलने के लिए कैसे करें

मैंने खुले() फ़ंक्शन का उपयोग करने का प्रयास किया जिसके लिए कुछ फ़ाइल को बहस के रूप में पथ की आवश्यकता होती है। लेकिन मैं अपने आवेदन में किसी भी फाइल का उपयोग नहीं कर रहा हूँ। मेरे पास सरल फ़ाइल डिस्क्रिप्टर हैं (int arr [2])।

क्या पाइप के साथ उपरोक्त परिदृश्य को हासिल करना संभव है ????

उत्तर

10

एक बार पाइप बंद हो जाने पर, यह बंद हो जाता है। आप इसे वापस नहीं ला सकते हैं।

यदि आप इसे और लिखना चाहते हैं, तो इसे पहले स्थान पर न बंद करें - यह उतना आसान है।

+3

यदि हम फ़ाइल वर्णनकर्ता बंद न रूप में जाना जाता हैं, यह संबंधित धारा को EOF नहीं भेजेंगे। तो बच्चे की प्रक्रिया में यह इनपुट के लिए लगातार इंतजार करेगा। लेकिन, मैं स्ट्रीम में सीमित संख्या में लिखना चाहता हूं और पाइप – chaitu

+0

@ चाइतु के दूसरे छोर पर समवर्ती रूप से पढ़ना चाहता हूं: यह सच है कि यदि आप लेखन अंत को बंद नहीं करते हैं, तो पठन अंत अंत फ़ाइल का नहीं दिखाएगा । इसका मतलब यह है कि अगर आप बच्चे को और संदेश भेजना चाहते हैं, तो आपको अपने संदेश के अंत को इंगित करने के लिए फ़ाइल के अंत के अलावा कुछ और उपयोग करने की आवश्यकता है (आमतौर पर, आप एक निश्चित-लंबाई संदेश का उपयोग करेंगे ताकि बच्चा कितना समय जानता हो यह है)। – caf

1

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

  1. फ़ाइल डिस्क पर अभी भी है
  2. यह कोई नाम
  3. यह अभी भी खुला
  4. जब यह बंद कर दिया है, कर्नेल यह हमेशा के लिए निकाल देता

यह जानते हुए कि यह हो सकता है में मदद करता है है समझने के लिए, फाइल, पाइप या फिर कुछ भी फिर से "फिर से खोलना" असंभव होगा। फ़ाइल नाम और वर्णनकर्ता के पास अलग-अलग जीवनकाल हैं।

केवल अपवाद stdout और stderr जिसका वर्णनकर्ता हमेशा 1 और 2

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