2009-12-27 13 views
13

यह स्पष्ट है कि सामान्य रूप से पढ़ने (2) सिस्टम कॉल पढ़ने के लिए कहा गया था उससे कम बाइट वापस कर सकते हैं। हालांकि, कुछ कार्यक्रमों का मानना ​​है कि स्थानीय फाइलों के साथ काम करते समय, पढ़ें (2) कभी भी पूछे जाने से कम नहीं लौटाता है (जब तक फ़ाइल निश्चित रूप से कम न हो)।"संक्षिप्त पढ़ा", यह कब हो सकता है?

तो, मेरा सवाल यह है कि: लिनक्स पर, कौन से मामलों को पढ़ा जा सकता है (2) खुली फ़ाइल से पढ़ने और ईओएफ का सामना नहीं किया जा रहा है उससे कम वापस लौटा सकता है और पढ़ने की राशि अधिकतम कुछ किलोबाइट है?

कुछ अनुमान:

  • संकेत इस तरह पढ़ने बीच में प्राप्त कर सकते हैं, लेकिन नहीं यह असफल बनाते हैं?
  • क्या विभिन्न फाइल सिस्टम इस व्यवहार को प्रभावित कर सकते हैं? क्या jffs2 के बारे में कुछ खास है?
+0

कौन से प्रोग्राम "मानते हैं कि स्थानीय फाइलों के साथ काम करते समय, पढ़ें (2) कभी भी पूछा गया उससे कम रिटर्न नहीं देता"? सामान्य मामले में, यह एक बग की तरह लगता है। – Ken

+0

उदाहरण के लिए, klibc utils में fstype बाइनरी। ऐसा लगता है कि कई निम्न-स्तरीय प्रोग्राम जो फ़ाइलों के साथ काम करने के लिए मान सकते हैं, सीधे मानते हैं कि पढ़ना कभी कम नहीं होता है। – Nakedible

उत्तर

13

POSIX.1-2008 states:

लौटे कम से कम nbyte हो सकता है अगर बाइट्स फ़ाइल के बचे हुए कम से कम nbyte है, अगर पढ़ने() अनुरोध था मूल्य सिग्नल द्वारा बाधित, या यदि फ़ाइल एक पाइप या फीफो या विशेष फ़ाइल है और nbyte बाइट्स से कम है पढ़ने के लिए उपलब्ध है।

डिस्क आधारित फ़ाइल सिस्टम आम तौर पर उपयोग करने के अबाधित पढ़ता है, जिसका मतलब है कि आम तौर पर आपरेशन पढ़ा एक संकेत से बाधित नहीं किया जा सकता। नेटवर्क-आधारित फाइल सिस्टम कभी-कभी इंटरप्टिबल रीड का उपयोग करते हैं, जो आंशिक डेटा या डेटा नहीं लौटा सकता है। (एनएफएस के मामले में यह intr माउंट विकल्प का उपयोग कर कॉन्फ़िगर करने योग्य है।) वे कभी-कभी टाइमआउट भी लागू करते हैं।

ध्यान रखें कि कुछ/मनमानी/फ़ाइल/पथ एक फीफो या विशेष फ़ाइल का संदर्भ ले सकता है, तो आपने जो भी सोचा था वह एक नियमित फ़ाइल नहीं हो सकती है।इसलिए आंशिक पढ़ने को संभालने के लिए अच्छा अभ्यास है, भले ही वे असंभव हो।

+1

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

+1

फाइल सिस्टम को एक ब्लॉक पढ़ने के बाद खुद को पढ़ने में बाधा डालने के लिए _allowed_ है। – Joshua

1

एक प्राप्त सिग्नल केवल पढ़ने() विफल हो जाता है अगर उसने अभी तक एक बाइट नहीं पढ़ा है। अन्यथा, यह आंशिक डेटा वापस आ जाएगा।

और मुझे लगता है कि वैकल्पिक फाइल सिस्टम वास्तव में अन्य परिस्थितियों में संक्षिप्त पढ़ सकते हैं। उदाहरण के लिए, यह कुछ समझ में आता है (मेरे लिए) नेटवर्क-आधारित फाइल सिस्टम नेटवर्क सॉकेट wrt लघु पढ़ने (= अक्सर उन्हें होने) की तरह व्यवहार करता है।

+0

धन्यवाद, यह सहायक था! हालांकि इंटरप्टिबल और अनियंत्रित फाइल सिस्टम पर जानकारी और भी सहायक थी। – Nakedible

3

मुझे यह पूछना है: "आप कारण क्यों देखते हैं"? यदि पढ़ा जाता है तो अनुरोधित राशि से कम बाइट्स लौटा सकता है (जो, जैसा कि आप इंगित करते हैं, यह निश्चित रूप से कर सकता है) आप उस स्थिति से निपटना क्यों नहीं चाहेंगे?

+0

जोड़ने के लिए, आप डेटा को किसी भी तरह से जांचने जा रहे हैं - इसलिए यदि यह छोटा है, तो आप तुरंत जान लेंगे। अन्यथा, पढ़ने का कारण क्या है? –

+9

नील, मुझे पूछना है: आप क्यों परवाह करते हैं कि वह क्यों जानना चाहता है कि यह कैसे हो सकता है? यहां तक ​​कि यदि वह इस स्थिति से संबंधित है तो यह जानना अभी भी बहुत उपयोगी है कि यह कैसे हो सकता है, उदाहरण के लिए ताकि वह कोशिश कर सके और परीक्षण कर सके कि उसका कोड इसे अपेक्षित रूप से संभालता है। और यदि यह उसका व्यक्तिगत कोड नहीं है जो इस मामले को संभालने में नहीं है, तो इस जानकारी को किसी भी बग रिपोर्ट या पैच सबमिशन के साथ होने वाली समस्या को पुन: पेश करने के निर्देशों के भाग के रूप में आवश्यक होगा। – mark4o

+0

कारण मैं पूछ रहा हूं कि हम इस व्यवहार को हजारों प्रणालियों के स्थापित आधार पर देख रहे हैं और हमें यथासंभव सटीक आकलन करने की आवश्यकता है कि यह समस्या लंबे समय तक कितनी आम हो सकती है। यह समझना कि यह कैसे या क्यों होता है जांच का एक हिस्सा है। – Nakedible

1

यदि यह वास्तव में एक फ़ाइल है जिसे आप पढ़ रहे हैं, तो आप फ़ाइल के अंत से पहले अंतिम पढ़ने के रूप में संक्षिप्त पढ़ सकते हैं।

हावेवर, आमतौर पर ऐसा व्यवहार करना सबसे अच्छा होता है जैसे कोई भी पढ़ा जा सकता है। यदि आप जो पढ़ रहे हैं वह फ़ाइल के बजाए एक पाइप या इनपुट डिवाइस (stdin) है, तो जब भी आपका बफर इनपुट बफर में मौजूद होता है, तो आप एक छोटा सा पढ़ सकते हैं।

+0

ईओएफ का सामना नहीं करने का मेरा मतलब यह है कि फ़ाइल के अंत से पहले यह आखिरी पठन नहीं है। साथ ही, प्रश्न में फ़ाइल एक नियमित फाइल है। – Nakedible

0

मुझे यकीन नहीं है लेकिन यह स्थिति तब उत्पन्न हो सकती है जब ओएस पृष्ठ कैश में पृष्ठों से बाहर हो रहा है। आप सुझाव दे सकते हैं कि उस मामले में फ्लश थ्रेड लगाया जाएगा, लेकिन यह I/O शेड्यूलर में उपयोग किए जाने वाले ह्युरिस्टिक पर निर्भर करता है। यह स्थिति कम बाइट्स को वापस पढ़ने के लिए पढ़ सकती है।

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