मेरा आवेदन डेटा लिखने की वांछित स्थिति खोजने के लिए lseek()
का उपयोग करता है। फ़ाइल को open()
का उपयोग करके सफलतापूर्वक खोला गया है और मेरा एप्लिकेशन lseek()
और write()
कई बार उपयोग करने में सक्षम था।lseek/लिखना अचानक रिटर्न -1 errno = 9 (खराब फ़ाइल वर्णनकर्ता)
एक भी समय, कुछ उपयोगकर्ताओं के लिए और आसानी से reproducable नहीं, lseek()
रिटर्न -1 9. फ़ाइल के errno
के साथ इस से पहले बंद नहीं है और filehandle (int) रीसेट नहीं कर रहा है।
इसके बाद, एक और फ़ाइल बनाई गई है; open()
ठीक है और lseek()
और write()
फिर से काम करता है।
इसे और भी खराब बनाने के लिए, इस उपयोगकर्ता ने फिर से पूर्ण अनुक्रम की कोशिश की और सभी ठीक थे।
तो मेरा सवाल यह है कि क्या ओएस किसी कारण से मेरे लिए फाइल हैंडल बंद कर सकता है? इसका कारण क्या हो सकता है? किसी फ़ाइल इंडेक्सर या फ़ाइल स्कैनर किसी प्रकार का?
इसे हल करने का सबसे अच्छा तरीका क्या है; क्या यह छद्म कोड सबसे अच्छा समाधान है? कुछ इसी तरह के साथ
int fd=open(...);
if (fd>-1) {
long result = lseek(fd,....);
if (result == -1 && errno==9) {
close(fd..); //make sure we try to close nicely
fd=open(...);
result = lseek(fd,....);
}
}
किसी अनुभव (कोड लेआउट, इसके लिए काम करता है पैदा करेगा कोई बात नहीं)?
सारांश: किसी दिए गए एफडी के लिए फाइल ढूंढना और लिखना ठीक है और अचानक किसी कारण के बिना errno = 9 वापस देता है।
अगर मैं खोलने की कोशिश करता हूं तो मेरा कोड संकलित नहीं होगा (...); अजीब। –
क्या आप छद्म कोड सही जानते हैं? –
lseek() EBADF साथ विफल रहता है, तो आप यकीन है कि है कि बंद() एक ही फाइल वर्णनकर्ता पर भी EBADF साथ विफल हो जाएगा हो सकता है। और चूंकि आप अपनी पुनः खुली या पुनः मांग कॉल की जांच नहीं करते हैं, इसलिए कुछ भी हो रहा है। –