2009-10-21 12 views
12

बंद किए बिना एक फ़ाइल सूचक बंद करें fdopen(), fileno() का उपयोग करके मौजूदा फ़ाइल वर्णनकर्ताओं के साथ स्ट्रीम खोलना संभव है। हालांकि, फ़ाइल को बंद करने का उचित तरीका, एक बार स्ट्रीम के साथ इसे खोलने के बाद fclose()FILE पॉइंटर है। स्ट्रीम को बंद कैसे कर सकता है, लेकिन खुले फ़ाइल डिस्क्रिप्टर को बनाए रख सकते हैं?अंतर्निहित फ़ाइल डिस्क्रिप्टर

यह व्यवहार fflush() और फिर fileno() पर कॉल करने जैसा है, और फिर बंद होने के अलावा, FILE पॉइंटर का उपयोग कभी नहीं कर रहा है। एक अतिरिक्त चिंता यह है कि यदि आप फिर fdopen() फिर से हैं, तो अब FILE पॉइंटर्स हैं, और आप उनमें से केवल एक को बंद कर सकते हैं।

उत्तर

18

आप एक POSIXy प्रणाली पर हैं (जो मुझे लगता है आप कर रहे हैं, जब से तुम fileno() हैं) तो आप फ़ाइल वर्णनकर्ता क्लोन करने के लिए dup() उपयोग कर सकते हैं:

int newfd = dup(fileno(stream)); 
fclose(stream); 

या आप fdopen() एक डुप्लिकेट फ़ाइल हाथ कर सकते हैं वर्णनकर्ता:

FILE *stream = fdopen(dup(fd), "r"); 

किसी भी तरह से, एफडी की अन्य प्रतिलिपि FILE * साथ बंद नहीं होगा। हालांकि, ध्यान रखें कि पॉइंटर साझा किया गया है, इसलिए सावधान रहें यदि आप एक ही समय में दोनों का उपयोग कर रहे हैं। इसके अलावा, जब आप प्रतिलिपि बंद करते हैं तो मूल fd पर fcntl() लॉक जारी किए जाएंगे।

+0

विंडोज़ और अन्य प्लेटफ़ॉर्म fileno() का समर्थन करते हैं! मुझे विश्वास नहीं है कि मैंने इस डुप्ली() समाधान, बहुत ही सुरुचिपूर्ण, और स्पष्ट –

+0

के बारे में नहीं सोचा था, आपको मूल fd पर नया fd वापस डुप्लिकेट करने की आवश्यकता नहीं है और फिर नया fd बंद करें() तो फाइल स्ट्रीम बंद होने के अलावा, सबकुछ पहले जैसा था, पीछे है? : डी जिसका मतलब है कि आपको fclose() से पहले oldfd = fileno (stream) की आवश्यकता है। –

+0

जोनाथन, बहुसंख्यक अनुप्रयोगों में कर रहा है। एफडी को 'fdopen' देने से पहले 'डुप्ली' करना बेहतर है ताकि आप सुनिश्चित हो सकें कि यह कभी भी आपके मूल को छूता नहीं है। – bdonlan

1

यदि सब कुछ विफल हो जाता है, तो डुप्लिकेट (2) मदद कर सकता है।

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