[H]ow serious is it, today or at any point in the past three decades?
विशिष्ट अनुप्रयोगों प्रक्रिया डेटा। वे कुछ इनपुट उपभोग करते हैं, और परिणाम उत्पन्न करते हैं। तो, दो सामान्य मामले हैं जहां close()
एक त्रुटि लौटा सकता है: इनपुट (केवल-पढ़ने के लिए) फ़ाइल बंद करते समय, और फ़ाइल को बंद करते समय जो अभी उत्पन्न या संशोधित किया गया था।
ज्ञात परिस्थितियां जहां close()
एक त्रुटि लौटाती है स्थायी डेटा को डेटा लिखने/फ़्लश करने के लिए विशिष्ट होती है। विशेष रूप से, स्थायी ऑपरेटिंग (close()
, fsync()
, या fdatasync()
पर) लिखने से पहले ऑपरेटिंग सिस्टम स्थानीय रूप से डेटा को कैश करने के लिए आम है; यह रिमोट फाइल सिस्टम के साथ बहुत आम है, और यही कारण है कि एनएफएस का उल्लेख मैन पेज पर किया गया है।
मुझे केवल पढ़ने-योग्य इनपुट फ़ाइल को बंद करते समय कभी भी कोई त्रुटि नहीं आई है। सभी मामलों में मैं सोच सकता हूं कि किसी भी सामान्य फाइल सिस्टम का उपयोग करके वास्तविक जीवन में यह कहां हो सकता है, जहां एक विनाशकारी विफलता है, कर्नेल डेटा संरचना भ्रष्टाचार जैसे कुछ। यदि ऐसा होता है, तो मुझे लगता है कि close()
त्रुटि केवल एकमात्र संकेत नहीं हो सकता है कि कुछ गलत है।
रिमोट फाइल सिस्टम पर एक फ़ाइल को लिखते समय, close()
-टाइम त्रुटियां बेहद आम हैं, यदि स्थानीय नेटवर्क ग्लिच के लिए प्रवण होता है या बस बहुत सारे पैकेट छोड़ देता है। एक अंतिम उपयोगकर्ता के रूप में, मैं चाहता हूं कि मेरे एप्लिकेशन मुझे बताए कि फ़ाइल में लिखते समय कोई त्रुटि हुई है या नहीं। आमतौर पर रिमोट फाइल सिस्टम से कनेक्शन पूरी तरह टूट जाता है, और तथ्य यह है कि एक नई फाइल को लिखना असफल रहा, उपयोगकर्ता के लिए पहला संकेतक है।
यदि आप close()
वापसी मूल्य की जांच नहीं करते हैं, तो एप्लिकेशन उपयोगकर्ता से झूठ बोलता है। यह इंगित करेगा (यदि कोई अन्य त्रुटि नहीं है तो त्रुटि संदेश की कमी से), कि फ़ाइल सही ढंग से लिखी गई थी, जब वास्तव में यह नहीं था, और एप्लिकेशन को बताया गया था; आवेदन सिर्फ संकेत को नजरअंदाज कर दिया। यदि उपयोगकर्ता मेरे जैसा है, तो वे एप्लिकेशन से बहुत नाखुश होंगे।
सवाल यह है कि, उपयोगकर्ता डेटा आपके लिए कितना महत्वपूर्ण है? अधिकांश वर्तमान अनुप्रयोग प्रोग्रामर बिल्कुल परवाह नहीं करते हैं। बेसिल स्टैरेनकेविच (मूल प्रश्न पर टिप्पणी में) बिल्कुल सही है; close()
त्रुटियों की जांच करना कुछ प्रोग्रामर कुछ परेशान नहीं करते हैं।
मुझे विश्वास है कि रवैया ग़लत है; उपयोगकर्ता डेटा के लिए cavalier उपेक्षा।
यह स्वाभाविक है, हालांकि, उपयोगकर्ताओं के पास कोई स्पष्ट संकेत नहीं है कि किस एप्लिकेशन ने अपने डेटा को दूषित कर दिया है।मेरे अनुभव में अंतिम उपयोगकर्ता सामान्य रूप से ओएस, हार्डवेयर, ओपन सोर्स या फ्री सॉफ़्टवेयर को दोष देते हैं, या स्थानीय आईटी समर्थन; इसलिए, प्रोग्रामर के लिए देखभाल करने के लिए कोई दबाव, सामाजिक या अन्यथा कोई दबाव नहीं है। क्योंकि केवल प्रोग्रामर इस तरह के विवरणों से अवगत हैं, और अधिकांश प्रोग्रामर परवाह नहीं है, स्थिति को बदलने के लिए कोई दबाव नहीं है।
(मुझे पता है कि उपर्युक्त प्रोग्रामर मेरे गले से नफरत करेंगे, लेकिन कम से कम मैं ईमानदार हूं। इस तरह की चीजों को इंगित करने के लिए मुझे सामान्य प्रतिक्रिया मिलती है कि यह एक दुर्लभ घटना है, यह जांचने के लिए संसाधनों का अपशिष्ट होगा। यह संभव है .. लेकिन मैं एक के लिए अधिक CPU चक्र खर्च करने और प्रोग्रामर को कुछ प्रतिशत अधिक भुगतान करने के लिए तैयार हूं, अगर इसका मतलब है कि मेरी मशीन वास्तव में अधिक अनुमानित रूप से काम करती है, और मुझसे कहता है अगर यह साजिश खो दिया है, के बजाय चुपचाप अपने डेटा भ्रष्ट)
Is there a simple, reproducible example of such silent loss of data?
मैं तीन तरीकों में से जानते हैं:।
यूएसबी स्टिक का उपयोग करें, और अंतिम write()
के बाद इसे बाहर निकालें लेकिन close()
से पहले। दुर्भाग्यवश, अधिकांश यूएसबी स्टिक में हार्डवेयर होता है जो इसे जीवित रहने के लिए डिज़ाइन नहीं किया गया है, इसलिए आप यूएसबी स्टिक को ब्रिक कर सकते हैं। फाइल सिस्टम के आधार पर, आपका कर्नेल भी घबरा सकता है, क्योंकि अधिकांश फाइल सिस्टम इस धारणा के साथ लिखे गए हैं कि यह कभी नहीं होगा।
एनएफएस सर्वर सेट अप करें, और एनएफएस सर्वर और क्लाइंट के बीच सभी पैकेट ड्रॉप करने के लिए iptables का उपयोग कर इंटरमीटेंट पैकेट बूंदों का अनुकरण करें। सटीक परिदृश्य सर्वर और क्लाइंट, माउंट विकल्प, और संस्करणों पर निर्भर करता है। हालांकि, परीक्षण परीक्षण दो या तीन आभासी मशीनों का उपयोग करके स्थापित करने के लिए अपेक्षाकृत आसान होना चाहिए।
close()
समय पर एक त्रुटि त्रुटि अनुकरण करने के लिए एक कस्टम फाइल सिस्टम का उपयोग करें। वर्तमान कर्नेल आपको टीएमएफएफ या लूपबैक माउंट्स को मजबूर नहीं करते हैं, केवल एनएफएस माउंट्स, अन्यथा यह अंतिम लिखने के बाद फाइल सिस्टम को बल-अनमाउंट करके अनुकरण करना आसान होगा लेकिन close()
से पहले। (वर्तमान फाइलें केवल उस फाइल सिस्टम पर खुली फाइलें हैं, तो इन्हें उमाउंट से इनकार कर दें।) एप्लिकेशन परीक्षण के लिए, close()
पर त्रुटि लौटाते हुए tffs का एक संस्करण बनाते हैं, यदि फ़ाइल मोड इंगित करता है कि यह वांछनीय है (उदाहरण के लिए, अन्य लिखने योग्य लेकिन नहीं अन्य पठनीय या अन्य निष्पादन योग्य, यानी -??????-w-
) काफी आसान और सुरक्षित होगा। यह वास्तव में डेटा को दूषित नहीं करेगा, लेकिन यह जांचना आसान होगा कि अगर कर्नेल रिपोर्ट (समय का) डेटा भ्रष्टाचार बंद कर देता है तो आवेदन कैसे व्यवहार करता है।
भले ही मैं आमतौर पर परिणाम की जांच करता हूं, कई सालों बाद, ऐसा लगता है कि ऐसा लगता है। इस उत्तर की प्रतीक्षा करें। – chux
उद्धरण इंडेंट करने के लिए धन्यवाद, एल्क। मुझे> कमांड के बारे में पता नहीं था। –
मैं आम तौर पर 'बंद' के परिणाम या विफलता की परवाह नहीं करता हूं। मुझे लगता है कि अगर आप एक बहुत मजबूत सर्वर सॉफ्टवेयर विकसित करना चाहते हैं तो आप परवाह करेंगे। लेकिन बग की कई अन्य संभावनाएं हैं :-) बीटीडब्लू, कुछ मुफ्त सॉफ्टवेयर 'क्लोज़' विफलता के बारे में परवाह करते हैं। –