2008-11-13 20 views
5

ऐसा लगता है कि निम्न कॉल जो आप उम्मीद करेंगे (स्ट्रीम बंद करें और किसी और इनपुट की अनुमति न दें - स्ट्रीम रिटर्न त्रुटि पर इनपुट के लिए कुछ भी इंतजार कर रहा है), लेकिन क्या यह सभी कंपाइलर्स/प्लेटफॉर्म पर सही होने की गारंटी है?क्या स्टडीन पर बंद/फ्लेक्स सही होने की गारंटी है?

close(fileno(stdin)); 
fclose(stdin); 
+1

आप केवल fclose (stdin) कर सकते हैं, यह फ़ाइल हैंडल पर बंद() को कॉल करेगा। –

उत्तर

3

प्रत्येक संभावित ऑपरेटिंग सिस्टम में कुछ भी गारंटीकृत नहीं है। हालांकि, कॉलिंग फ्लेक्ज़ (stdin) किसी भी POSIX अनुपालन ऑपरेटिंग सिस्टम के साथ-साथ विंडोज ऑपरेटिंग सिस्टम पर भी काम करेगा, इसलिए आपको इस समय सामान्य उपयोग में बहुत कुछ करना चाहिए।

पिछले उत्तर के साथ-साथ मेरी टिप्पणी के अनुसार, फ़ाइल हैंडल पर बंद करने की आवश्यकता नहीं है। fclose() आपके लिए सब कुछ ठीक से बंद कर देगा।

14

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

ऐसा मत करो।

एजीएच। गंभीरता से। बुरा।

+5

वास्तव में, fclose() से पहले() को बंद करने के लिए बंद करने के लिए कोई उत्कृष्ट डेटा होने पर fclose() को विफल करने की गारंटी दी जाती है। (एक सामान्य मामले में, जहां निकट() और fclose() के बीच अन्य कोड हो सकता है, fclose() बस गलत फ़ाइल को लिख सकता है!) –

+0

यह ... तकनीकी रूप से प्रश्न का उत्तर नहीं देता है । –

+0

यह करता है: ओपी के कोड का व्यवहार अपरिभाषित होगा। यह संभावना नहीं है कि फ्लेक्स के कार्यान्वयन से पता चल जाएगा कि एफडी बंद कर दिया गया था। यदि कॉल के बीच बंद होने और फ्लेक्ज़ करने के बीच उनकी अन्य चीजें चल रही थीं, तो एक और ग़लत संभावना है: फ़ाइल डिस्क्रिप्टर को बंद करने के बाद, अगली कॉल खोलने के लिए() अभ्यास की संभावना है - अभ्यास में - उस फ़ाइल डिस्क्रिप्टर का पुन: उपयोग करने के लिए। क्या होगा यदि आप अंतर्निहित वर्णनकर्ता को बंद करते हैं, तो उसी इंडेक्स के साथ एक और डिस्क्रिप्टर खोला जाता है, जिसे फ्लेक्ज़ कहा जाता है? वह आखिरी खुला() का एफडी निश्चित रूप से कम से कम खराब होगा। – Sniggerfardimungus

17

fclose(stdin) अपरिभाषित व्यवहार है, जो एक बहुत बुरी बात है आह्वान करने के लिए stdin (अस्पष्ट या स्पष्ट) के किसी भी आगे उपयोग के कारण बनता है। यह "इनपुट को रोकता नहीं है"।

close(fileno(stdin)) इनपुट पर किसी भी आगे प्रयास stdin से, के बाद वर्तमान बफर समाप्त हो गया है, EBADF के साथ विफल करने का कारण बनता है, लेकिन केवल जब तक आप एक और फ़ाइल, जिस स्थिति में है कि फाइल fd बन जाएगा खोलने # 0 और बुरी चीजें होगा होता है।

एक और अधिक मजबूत दृष्टिकोण हो सकता है:

int fd = open("/dev/null", O_WRONLY); 
dup2(fd, 0); 
close(fd); 
कुछ जोड़ा त्रुटि जाँच के साथ

। इससे यह सुनिश्चित होगा कि सभी पढ़ते हैं (वर्तमान बफर समाप्त होने के बाद) त्रुटियों में परिणाम होता है। यदि आप बस उन्हें ईओएफ में परिणाम देना चाहते हैं, तो कोई त्रुटि नहीं, O_WRONLY के बजाय O_RDONLY का उपयोग करें।

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

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