2011-03-12 20 views
11

पॉज़िक्स पढ़ने() लिखने() लिनक्स कॉल का उपयोग करके, यह गारंटी है कि अगर मैं एक फ़ाइल डिस्क्रिप्टर के माध्यम से लिखता हूं और एक और फ़ाइल डिस्क्रिप्टर के माध्यम से पढ़ता हूं, तो एक धारावाहिक फैशन में जैसे कि दो क्रियाएं पारस्परिक रूप से होती हैं एक-दूसरे के अनन्य ... कि मेरी पढ़ी गई फ़ाइल डिस्क्रिप्टर हमेशा लिखती है कि लिखने वाले फ़ाइल डिस्क्रिप्टर द्वारा आखिरी बार क्या लिखा गया था?दो फ़ाइल डिस्क्रिप्टर एक ही फ़ाइल में

मेरा मानना ​​है यह मामला है, लेकिन मैं यह सुनिश्चित करना चाहते हैं और आदमी पेज नहीं इस

उत्तर

17

यह इस बात पर निर्भर करता है कि आपको दो फ़ाइल डिस्क्रिप्टर कहां मिलते हैं। यदि वे एक डुप्लिक (2) कॉल से आते हैं, तो वे फ़ाइल ऑफ़सेट और स्थिति साझा करते हैं, इसलिए एक पर लिखना (2) एक दूसरे की स्थिति को प्रभावित करेगा। यदि, दूसरी तरफ, वे दो अलग-अलग खुले (2) कॉल से आते हैं, प्रत्येक के पास अपनी फ़ाइल ऑफ़सेट और स्थिति होगी।

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

+0

क्या होगा यदि मैं प्रत्येक पर अलग-अलग खुले() कॉल का उपयोग करता हूं .. क्या लिखित एफडी का डेटा पढ़ने के लिए उपलब्ध होगा? –

+2

दो अलग-अलग खुली कॉल के साथ, प्रत्येक एफडी की अपनी स्थिति होगी। तो यदि दोनों फाइल की शुरुआत में हैं, और आप एक के साथ लिखते हैं, तो दूसरा अभी भी फाइल की शुरुआत में होगा, इसलिए एक लिखने पर लिखा होगा कि पहले लिखने के लिए क्या लिखा गया था, जब तक कि आपने O_APPEND के साथ फ़ाइल नहीं खोली जो मामला प्रत्येक लिखने को लिखने से पहले अंततः खोजना चाहता है)। –

+4

धन्यवाद क्रिस। मेरा सवाल थोड़ा अलग था, लेकिन हाँ ... अगर वह दूसरा पढ़ रहा था, तो यह बिल्कुल पढ़ेगा कि पहले व्यक्ति ने क्या लिखा था। मेरे प्रश्न के लिए असर यह है कि हां, इसकी गारंटी है कि लिखने के बाद फ़ाइल से पढ़ने वाले किसी भी व्यक्ति ने जो भी लिखा है उसे पढ़ा जाएगा। ऐसा इसलिए है क्योंकि लिनक्स मेमोरी –

1

अगर वे दोनों एक ही फाइल विवरण देखें यह गारंटी है, उर्फ ​​आप उन लोगों से मिल गया पर बहुत उपयोगी है "डुप्लिक" या "डुप् 2" (या fork() के माध्यम से विरासत में मिला)।

में से एक से एक सफल वापसी के बाद इन सिस्टम कॉल, पुराने और नए फ़ाइल वर्णनकर्ता interchangeably उपयोग किया जा सकता है। वे समान खुले फ़ाइल विवरण का संदर्भ लें ( खुला (2) देखें) और इस प्रकार फ़ाइल ऑफसेट और फ़ाइल स्थिति झंडे साझा करें; उदाहरण के लिए, यदि फ़ाइल ऑफसेट को lseek (2) का उपयोग करके वर्णक में से एक पर का उपयोग करके संशोधित किया गया है, तो ऑफसेट अन्य के लिए भी बदला जाता है।

0

जब आप dup() या dup2() या fork(), फ़ाइल तालिका का उपयोग फ़ाइल वर्णनकर्ता के दोनों द्वारा साझा किया जाता। इसलिए यदि आप write एक फ़ाइल डिस्क्रिप्टर से कुछ और फिर write अन्य फ़ाइल डिस्क्रिप्टर के माध्यम से कुछ है, तो इसे अधिलेखित नहीं किया गया है।

लेकिन यदि दो स्वतंत्र प्रक्रिया एक फ़ाइल खोलती है, तो दोनों प्रक्रियाओं द्वारा लिखित डेटा मिश्रित हो सकता है।

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