2010-04-18 15 views
6

मेरे पास एक बहुप्रचारित एप्लिकेशन है जो एक ही फ़ाइल खोल रहा है और पढ़ रहा है (लिखना नहीं)। मैं प्रत्येक थ्रेड के लिए एक अलग फ़ाइल डिस्क्रिप्टर खोल रहा हूं (लेकिन वे सभी एक ही फाइल को इंगित करते हैं)। प्रत्येक धागा तब फ़ाइल को पढ़ता है और इसे बंद कर सकता है और यदि EOF पहुंच जाता है तो इसे फिर से खोलें। यह ठीक है? यदि मैं फ़ाइल डिस्क्रिप्टर पर fclose() निष्पादित करता हूं तो क्या यह अन्य फ़ाइल अवरोधकों को प्रभावित करता है जो एक ही फ़ाइल को इंगित करते हैं?एक ही फ़ाइल में एकाधिक फ़ाइल डिस्क्रिप्टर, सी

उत्तर

3

यह ठीक है। आप हर बार एक ही फाइल चाहते हैं खोल सकते हैं और प्रत्येक फ़ाइल डिस्क्रिप्टर एक दूसरे से स्वतंत्र होगा।

0

यह ठीक काम करना चाहिए, बशर्ते प्रत्येक धागे का अपना फ़ाइल संभाल हो। चूंकि आपने fclose() का उपयोग करने का उल्लेख किया है, जो सुझाव देता है कि आप प्रत्येक थ्रेड में fopen() का भी उपयोग कर रहे हैं और प्रत्येक थ्रेड केवल अपने FILE * चर को प्रभावित करता है।

क्या कोई समस्या है?

+0

मूल रूप से, मैंने कुल वाई धागे के लिए फ़ाइल पॉइंटर्स की एक 2-मंद सरणी बनाई (क्योंकि प्रत्येक थ्रेड पढ़ा जाएगा, कहें, एक्स फाइलें)। तो मेरी फ़ाइल * सरणी सरणी है [y] [x]। दिए गए धागे के लिए, मैं फॉपेन (सरणी [i] [0]) के माध्यम से एक फ़ाइल खोलता हूं उदाहरण के लिए (फ़ाइल 0 के लिए)। मैं फिर फ़ाइल को पढ़ता हूं (फ़्रेड) (सभी एक बार में नहीं) और अन्य कार्य करते हैं (हालांकि कोई फ़ाइल लेखन नहीं होता है)। एक पढ़ने के दौरान, यदि ईओएफ पहुंचा है, तो मैं fclose करता हूं और फिर फिर से fopen। मेरी चिंता यह थी कि, जब मैं फोकस और फॉपेन करता हूं, तो क्या मैं किसी भी तरह से अन्य फाइलों से इंगित कर सकता हूं जो अन्य फाइलों से इंगित कर रहे हैं जो उसी फ़ाइल को इंगित कर रहे हैं, मैंने एफ – Gigi

+0

का प्रदर्शन किया है, अपना 'फॉपेन()' मानना ​​एक टाइपो है (यह 'सरणी [i] [0] = fopen' होना चाहिए ...), फिर हाँ, यह ठीक काम करेगा। बशर्ते प्रत्येक थ्रेड अन्य धागे से संबंधित डेटा में हेरफेर नहीं करता है। – wallyk

+0

धन्यवाद। हां, सभी फाइलें इस फाइलों पर कर रही हैं fopen(), fread(), और fclose() हैं। – Gigi

3

लिनक्स सिस्टम के लिए आपको ऐसा करने के लिए एकाधिक फ़ाइल डिस्क्रिप्टर की आवश्यकता नहीं है। आप फ़ाइल डिस्क्रिप्टर को संशोधित किए बिना एक एकल फ़ाइल डिस्क्रिप्टर साझा कर सकते हैं और pread परमाणु रूप से एक खोज/पढ़ाई ऑपरेशन करने के लिए उपयोग कर सकते हैं।

+0

'प्रीड' पॉज़िक्स है इसलिए यह लिनक्स तक ही सीमित नहीं है। –